class Counter extends Thread {
int i = 10;
public synchronized void display (Counter obj) {
try {
Thread.sleep(5);
obj.increment(this);
System.out.println(i);
}
catch
(InterruptedException ex) { }
}
public synchronized void increment (Counter obj) {
i++;
}
}
public class Test {
public static void main(String[] args) {
final Counter obj1
= new Counter();
final Counter obj2
= new Counter();
new Thread(new Runnable() {
public void run() {
obj1.display(obj2);
}
}).start();
new Thread(new Runnable() {
public void run() {
obj2.display(obj1);
}
}).start();
}
}
From what threading problem does the program suffer?
A.
deadlock
B.
livelock
C.
starvation
D.
race condition
Risposta A
Si incontra un problema di deadlock perché i 3d si
bloccano a vicenda.
Infatti il 3D1 parte
ma il piccolo sleep lo ferma abbastanza per permettere anche al 3D2 di
partire. A questo punto il 3D1 sta lavorando e come obj ha obj2 mentre anche il
3D2 sta lavorando e come obj ha obj1. Quando si prova a fare il primo increment
, stiamo chiamando il metodo increment con obj2 come ingresso, ma questo è il
3D2 che è occupato. Solo che 3D2 non si libera mai perché ad un certo punto
prova anch’egli a fare un increment dell’obj1, che a sua volta è occupato.
Quindi 3D1 aspetta 3D2 che però aspetta 3D1 :
Deadlock.

Nessun commento:
Posta un commento