2016-06-11 3 views
-6

Ich habe zwei Threads, t1 und t2 der gleichen Klasse; t1 synchronisiert sich auf der Klasse selbst, während t2 auf this (die Instanz) synchronisiert. Angenommen, t1 ist in den Synchronisationsblock eingetreten, kann t2 eingegeben werden, während t1 noch in seinem Synchronisationsblock ist?Java-Sync-Klasse und das von zwei Threads

Edit: Beispiel:

public class MyThread extends Thread{ 
private int id; 
public MyThread(int i){id=I;} 
public void run(){ 
    if(id==1)//t1 will lock the clas 
     synchronize(MyThread.class){ 
      … 
     } 
    else if(id==2) //t2 will lock the instance 
     synchronize(this){ 
      … 
     } 
} 

}

+1

Bitte den Code eingeben. Reduziere es wenn möglich auf einen einfachen Testfall. Und versuchen Sie es auch, um zu sehen, was passiert, bevor Sie fragen. Die wichtigste Fähigkeit eines Entwicklers ist die Fähigkeit zu experimentieren, um herauszufinden, wie sich Code verhält. –

+0

Ich denke, die Antwort ist ja. Aber ich hätte die Frage falsch verstehen können, und die wirkliche Antwort könnte Nr. –

+0

@JimGarrison sein Ich fügte ein Beispiel Code – Erez

Antwort

1

In Ihrem Beispiel

  • All MyThread Instanzen mit id von 1 synchronisiert auf dem MyThread Klassenobjekt erstellt. Dies bedeutet, dass keine zwei MyThread Instanzen gleichzeitig im ersten Block synchonized sein können.

  • Alle MyThread mit id von 2 erstellt Instanzen auf this synchronisiert werden. Jetzt this ist das Thread-Objekt selbst . Da jeder Thread einen anderen MyThread hat, bedeutet das, dass es effektiv keine Verriegelung gibt.

  • die Run-Methode für eine Instanz mit id Wert 1 wird eine Instanz mit id2 Wert oder umgekehrt nicht blocken. Sie verwenden verschiedene Sperren.


1 - In der Theorie, wenn ein Thread eines anderen MyThread Objekt Thread zugreifen kann, könnte es explizit nennt sie die run() Methode für das Objekt. Immerhin ist die Methode public. In diesem Fall wäre der this nicht der aktuelle Thread ... und daher hätten Sie möglicherweise eine Sperre. Dies ist jedoch nicht die Art von Dingen, die ein vernünftiger Programmierer tun würde.

2

Ja, der zweite Thread kann seinen synchronisierten Block einzutreten, während der erste Thread noch in dem synchronisierten Block befindet. Das liegt daran, dass die beiden Threads unterschiedliche Dinge synchronisieren - der erste Thread einer Klasse, der zweite Thread einer Instanz dieser Klasse.

Verwandte Themen