Die Sperrobjekte unterscheiden sich in der statischen Methode und der nicht statischen Methode. Die statische Methode verwendet das Klassenobjekt als Sperre (lock obj: MyClass.class
), während die nicht statische Methode das Instanzobjekt als Sperre verwendet, an die der Aufruf der Methode zu dieser Zeit gebunden ist (lock obj: this
).
entspricht
%Vor%während
%Vor%entspricht
%Vor% Das bedeutet: statische Methoden sperren das Klassenobjekt der Klasse. Nicht statische Methoden sperren die Instanz, auf der sie aufgerufen werden (standardmäßig ist auch synchronized(anyOtherLock)
möglich). Da sie verschiedene Objekte sperren, blockieren sie sich nicht gegenseitig.
Nicht statische synchronisierte Methoden setzen die Monitorsperre auf 'this'- Dies bedeutet nur, dass das aktuelle Objekt gesperrt ist. So werden alle mit dem aktuellen Objekt verbundenen Threads blockiert, um auf nicht statische Synchronisierungsmethoden dieser Klasse zuzugreifen, wenn ein Thread auf nicht statische zugreift synchronisierte Methode. während die Threads anderer Objekte weiterhin auf die Methoden zugreifen können.
Und statische synchronisierte Methoden setzen die Monitorsperre auf das Klassenobjekt. Das heißt, wenn ein Thread eines Objekts auf die Methode zugreift, werden alle Threads unabhängig von Objekten blockiert, um auf alle statischen synchronisierten Methoden der Klasse zuzugreifen.
öffentliche Klasse TestSync {
%Vor%} Führen Sie einmal die statische Synchronisierung durch und entfernen Sie dann die nicht statischen synchronisierten Aufrufe (und den Kommentar, der statisch synchronisiert ist) in runnable und run. Du wirst es besser verstehen.
Tags und Links java multithreading