1. Der Unterschied zwischen synchronisiert und statisch synchronisiert
Synchronisiert sperrt die aktuelle Instanz der Klasse, um zu verhindern, dass andere Threads gleichzeitig auf alle synchronisierten Blöcke der Instanz der Klasse zugreifen Instanz der Klasse". Für zwei verschiedene Instanzen einer Klasse gilt diese Einschränkung nicht. Dann geschieht die statische Synchronisierung, um den Zugriff auf alle Instanzen der Klasse zu steuern. Die statische Synchronisierung verhindert, dass Threads gleichzeitig auf alle Instanzen der Klasse in der JVM zugreifen und auf den entsprechenden Code zugreifen. Wenn in der Klasse eine Methode oder ein Codeblock synchronisiert ist, verfügt die Klasse nach dem Generieren einer Instanz der Klasse über einen Überwachungsblock und der synchronisierte Schutzblock wird platziert, um Threads den Zugriff auf die Instanz zu ermöglichen Gleichzeitig teilen sich statisch synchronisiert alle Instanzen dieser Klasse einen gemeinsamen Monitor, was den Unterschied zwischen den beiden darstellt, d. h. synchronisiert ist äquivalent zu this.synchronized und
statisch synchronisiert ist äquivalent zu Something.synchronized.
Der japanische Autor Jie Chenghao „Java Multithreading Design Patterns“ hat ein solches Beispiel:
public class Something(){
public synchronisiert void isSyncA(){}
public synchronisiert void isSyncB(){}
public static synchronisiert void cSyncA(){}
) und y.cSyncB( )
d. x.isSyncA() und Something.cSyncA()
Hier lässt sich eindeutig beurteilen:
a, beide greifen auf die synchronisierte Domäne derselben Instanz zu, können also nicht sein gleichzeitiger Zugriff
b, gilt für verschiedene Instanzen, sodass gleichzeitig darauf zugegriffen werden kann
c, da statisch synchronisiert, sodass verschiedene Instanzen weiterhin eingeschränkt sind, äquivalent zu Something.isSyncA() und Something.isSyncB(), daher kann nicht gleichzeitig auf sie zugegriffen werden.
Was ist also mit d? Auf die Antwort im Buch kann gleichzeitig zugegriffen werden. Der Grund für die Antwort ist, dass synchronisierte Instanzmethoden und synchronisierte Klassenmethoden unterschiedliche Sperren haben.
Persönliche Analyse ist, dass synchronisiert und statisch synchronisiert zwei Banden entsprechen. Jeder ist für seine eigenen Angelegenheiten verantwortlich. Es gibt keine Einschränkungen füreinander und es kann gleichzeitig darauf zugegriffen werden. Es ist noch nicht klar, wie das interne Design von Java synchronisiert wird.
Fazit: A: synchronisiertes statisches ist der Bereich einer bestimmten Klasse, synchronisiertes statisches cSync{} verhindert, dass mehrere Threads gleichzeitig auf die synchronisierte statische Methode in dieser Klasse zugreifen. Es funktioniert auf allen Objektinstanzen der Klasse.
B: synchronisiert ist der Bereich einer Instanz, synchronisiert isSync(){} verhindert, dass mehrere Threads gleichzeitig auf die synchronisierte Methode in dieser Instanz zugreifen.
2. Der Unterschied zwischen synchronisierten Methoden und synchronisiertem Code
Es gibt keinen Unterschied zwischen synchronisierten Methoden(){} und synchronisiert(this){}, nur synchronisierte Methoden(){ } ist leicht zu lesen und zu verstehen, und synchronisiert(this){} kann Konfliktbereiche mit eingeschränktem Zugriff genauer steuern und manchmal effizienter arbeiten.
3. Das synchronisierte Schlüsselwort kann nicht vererbt werden