2017-01-20 3 views
-1

Ich ging durch multi-Threading Konzepte.Unterschied zwischen synchronisiert (foo.class) vs synchronisiert (SomeClass.class)

public class Foo{ 

    public void testMethod1(){ 

     synchronized(foo.class){ 

     // only one thread can access this block at a time 
     } 

    } 

    // or i can use the below method 

    public void testMethod2(){ 

     synchronized(SomeClass.class){ 

     // only one thread can access this block at a time 

     } 
    } 

} 

Ich werde entweder testMethod1 oder testMethod2 in meinem Code verwenden.

Wie Sie sehen, ich bin mit synchronized auf dem Foo.class in testMethod1(), und SomeClass.class in testMethod2().

Wenn jemand Methode ich verwende es gibt dasselbe Ergebnis in mehreren Thread-Zugriff. Ich möchte den Unterschied zwischen den Verwendungen wissen, wenn ich die gleiche Klasse für den synchronisierten Block und eine andere Klasse für den synchronisierten Block verwenden muss.

Oder gibt es einen Unterschied zwischen den beiden oben genannten Methoden?

+1

Es gibt keinen Unterschied zwischen ihnen. –

+2

Ja, es gibt einen Unterschied. Sie synchronisieren nicht auf demselben Objekt, so dass sie sich nicht gegenseitig ausschließen, was bedeutet, dass ein Thread Code innerhalb von 'synchronized (foo.class)' Block ausführen kann, während ein anderer Thread Code innerhalb der 'synchronized (SomeClass.class)' Klasse ausführen kann , **gleichzeitig**. – Andreas

+1

Meine Ergebnisse. AnyClass.class oder AnyClass.getClass() gibt ein Klassenobjekt zurück, das eindeutig/singleTon ist. Daher wird synchronisiert (AnyClass.class) eine Sperre für diesen Verweis haben, daher kann nur ein Thread auf diesen Block zugreifen. Auch können wir private statische finale verwenden Objekt lock = new Object(); um eine Sperre zu machen. So können wir AnyClass.class im synchronisierten Block verwenden. –

Antwort

1

Wir synchronisieren auf Objekte, nicht auf Klassen. Und das tun Sie auch: Sie synchronisieren auf zwei verschiedenen Instanzen der Klasse. Wenn wir ein wenig umschreiben, es klarer wird:

public class Foo { 

    // the locks for the synchronized methods 
    private Class<Foo> lock1 = Foo.class; 
    private Class<SomeClass> lock2 = SomeClass.class; 

    public void testMethod1() { 
     synchronized (lock1) { 
      // only one thread can access this block at a time 
     } 
    } 

    public void testMethod2() { 
     synchronized (lock2) { 
      // only one thread can access this block at a time 
     } 
    } 
} 

Wir haben zwei Schlösser können beide Verfahren parallel, aber jedes Verfahren von einem Thread zu einem Zeitpunkt nur ausgeführt werden.

Wenn wir die gleiche Sperre für beide Methoden verwenden würde, dann könnten die Methoden nicht mehr parallel ausgeführt werden (wenn ein Thread 1-Methode eingegeben hat, dann 2-Methode gesperrt werden würde)

Hoffe, es hilft !

+0

Hallo Andeas. Ich habe die Frage bearbeitet. Eigentlich meine Frage synchronisiert (foo.class) und synchronisiert (SomeClass.class), wann sollte ich die gleiche Klasse für synchronisierte Block und wenn eine andere Klasse verwenden. Wie ich weiß, synchronisiert Block synchronisiert Sperre auf Klassenebene und nur ein Thread kann auf diesen Block zugreifen. Also kann ich jede Klasse verwenden, um eine Sperre auf Klassenebene durchzuführen. –

+1

@Andreas_D Was ist besonders daran, Klassenreferenzen als Sperre zu verwenden? Wenn wir 'private final Object lock1 = neues Objekt();' und 'private final Object lock2 = neues Objekt();' verwenden, hat das auch den gleichen Effekt. Ist es nicht? –

+0

Bitte lesen Sie meine Antwort sorgfältig durch. Die Sperre ist keine * Klasse *, sondern ein * Objekt *. Sie müssen keine Klasseninstanzen verwenden, ein 'privates Objekt lock3 = new Object()' würde das gleiche tun. Wenn Sie einzelne Methoden sperren möchten, verwenden Sie unterschiedliche Sperren für die Methoden. Wenn Sie Methodengruppen insgesamt sperren möchten, verwenden Sie eine einzige Sperre für mehrere Methoden. Es hängt nur von Ihrem Anwendungsfall ab, von dem Problem, das Sie mit dem Code lösen möchten. –