2011-10-05 16 views
7

Ho il seguente programma nello stesso file. Ho sincronizzato il metodo run().perché il metodo sincronizzato consente l'esecuzione contemporanea di più thread?

class MyThread2 implements Runnable { 
    Thread t; 

    MyThread2(String s) { 
     t=new Thread(this,s); 
     t.start(); 
    } 

    public synchronized void run() { 
     for (int i=0;i<3;i++) { 
      System.out.println("Thread name : "+ Thread.currentThread).getName()); 
      try { 
       t.sleep(1000); 
      } 
      catch (InterruptedException e) { 
       e.getMessage(); 
      } 
     } 
    } 
} 

class TestSync { 
    public static void main(String[] args) { 
     MyThread2 m1=new MyThread2("My Thread 1"); 
     c.fun(); 
    } 
} 

class c { 
    static void fun() { 
     MyThread2 m1=new MyThread2("My Thread 4"); 
    } 
} 

uscita è

Thread name : My Thread 1 
Thread name : My Thread 4 
Thread name : My Thread 4 
Thread name : My Thread 1 
Thread name : My Thread 1 
Thread name : My Thread 4 

mia domanda è perché è il metodo che consente sia "My filettatura 1" e "My filettatura 4" accesso filo contemporaneamente sincronizzato?

+2

Il codice che hai postato ha almeno una sintassi errore, ed è davvero difficile da leggere come è. Assicurati di pubblicare il tuo codice reale e prova a formattarlo in modo leggibile. – Mat

+0

L'equivoco è che si sta bloccando un metodo, invece si dispone di un metodo che blocca l'istanza. –

risposta

27

synchronized i metodi funzionano a livello di istanza. Ogni istanza della classe ottiene il proprio blocco. Il blocco viene acquisito ogni volta che viene immesso qualsiasi metodo synchronized dell'istanza. Ciò impedisce più thread che chiamano i metodi synchronizednella stessa istanza (notare che ciò impedisce anche che diversi metodisynchronized vengano richiamati nella stessa istanza).

Ora, poiché si dispone di due istanze della classe, ogni istanza ottiene il proprio blocco. Non c'è nulla per impedire che i due thread operino contemporaneamente sulla propria istanza.

Se si vuole evitare questo, si potrebbe avere un blocco synchronized(obj) all'interno run(), dove obj sarebbe qualche oggetto condiviso da entrambe le istanze di classe:

class MyThread2 implements Runnable { 
    private static final Object lock = new Object(); 
    ... 
    public void run() { 
    synchronized(lock) { 
     ... 
    } 
    } 
} 
+0

Grazie per la risposta – user980089

+0

Se abbiamo solo un'istanza di classe e più thread, è possibile eseguire contemporaneamente alcuni metodi 'sincronizzati'? – Sajad

+0

@ssss: sicuro: 'statico' rispetto a nonstatico', utilizzando i blocchi' sincronizzati' con diversi lucchetti, ecc. Per ulteriori informazioni, si prega di inviare una nuova domanda. – NPE

Problemi correlati