martedì 5 novembre 2013

Q31

Given:
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