2010-07-12 21 views
9

Ich habe 2 synchronisierte Methoden in einer Klasse say method1() und method2(). Ein Thread sagen "Thread 1" hält die Sperre für dieses Objekt der Klasse durch Ausführen der synchronisierten Methode1(). Kann ein anderer Thread sagen "Thread 2", Zugriff auf die Sperre über Methode2() zur gleichen Zeit während "Thread 1" halten das Schloss.zwei verschiedene synchronisierte Methoden des gleichen Objekts?

Dieser Fall ist analog zu java.util.Vector Klasse mit synchronisierten add() und remove() Methoden. Bitte erläutern Sie auch diesen Fall.

Antwort

10

Nr. Eine synchronized Methode in Java ist identisch mit der gesamten Methode, die ihren Körper in einen synchronized (this) Block gewickelt hat. Wenn also ein Thread in einer synchronized-Methode ist, kann ein anderer Thread nicht gleichzeitig in einer anderen synchronized Methode für dasselbe Objekt sein.

Die Art, wie sich dies auf eine Vector bezieht, ist, dass Sie nicht möchten, dass Code versucht, ein Element zu entfernen, während anderer Code versucht, ein Element hinzuzufügen. Dies ist das Konzept eines kritischen Abschnitts; Sie wollen nicht nur, dass jemand anderes versucht, das zu tun, was Sie tun, Sie wollen auch nicht, dass jemand anderes etwas anderes tut, was stören würde.

+0

Dank Borealid .. Aber wenn dies der Fall ist, warum Java-Synchronisation spezifische Methoden bietet, kann es nur für die vorgesehenen ganze Klasse? – JavaUser

+1

@JavaUser: 'synchronisiert (this)' bedeutet nicht, dass die ganze Klasse "synchronisiert" ist. Dies bedeutet, dass Sie die Objektsperre der Instanz erhalten, auf der die Methode aufgerufen wurde. Sie wollen nicht unbedingt, dass * alle * Methoden 'synchronisiert' werden (in der Tat werden Sie dies selten tun). Um die Leistung von Multithread-Code zu erhalten, müssen Sie so wenig Sperren wie möglich verwenden, während die Programmkorrektheit erhalten bleibt. Jedes Mal, wenn Sie eine Contended-Sperre haben, warten einige Threads und tun nichts. – Borealid

+0

@ Borealid .. der Moment, den ich in einer beliebigen Methode synchronisiert bedeutet, ist das ganze Objekt gesperrt, wenn ich diese Methode aufrufen .. bin ich richtig? – JavaUser

3

Thread2 kann auf das Schloss zugreifen, aber es kann nicht in den Block gelangen, der von diesem Schloss geschützt wird, solange Thread1 dasselbe Schloss hält.

+0

das war nützlich. Vielen Dank! – peakit

Verwandte Themen