1、synchronisierte Methode.
public synchronized void save(){}
2、synchronisierter Codeblock.
synchronized(object){ }
3、Verwenden Sie flüchtige Variablen.
Die Verwendung von volatile zum Ändern eines Felds entspricht der Anweisung an die virtuelle Maschine, dass das Feld möglicherweise von anderen Threads aktualisiert wird. Daher muss es jedes Mal neu berechnet werden, wenn das Feld verwendet wird, anstatt den Wert im Register zu verwenden.
4、Verwenden Sie die Reentrant Lock (ReenreantLock)
public void save(int money) { lock.lock(); try { account += money; } finally { lock.unlock(); } }
5、Verwenden Sie die ThreadLocal-Variable, dann erhält jeder Thread, der die Variable verwendet, eine Kopie der Variablen, und die Kopien sind unabhängig voneinander , sodass jeder Thread seine eigene Kopie der Variablen nach Belieben ändern kann, ohne andere Threads zu beeinträchtigen.
6、Verwenden Sie Blockierungswarteschlangen (LinkedBlockingQueue usw.)
7、Verwenden Sie atomare Variablen (AtomicInteger usw.)
Zusammenfassung:
synchronisiert:
Synchronisiert eignet sich sehr gut, wenn gelegentlich eine Synchronisierung erfolgt. Der Grund dafür ist, dass Compiler die Synchronisierung normalerweise so weit wie möglich optimieren. Synchronisiert wird auf JVM-Ebene implementiert. Synchronisierte Sperren können nicht nur durch einige Überwachungstools überwacht werden, sondern die JVM gibt die Sperre auch automatisch frei, wenn während der Codeausführung eine Ausnahme auftritt.
ReentrantLock:
ReentrantLock bietet eine Vielzahl von Synchronisierungen, z. B. zeitlich begrenzte Synchronisierung, unterbrechbare Synchronisierung (synchronisierte Synchronisierung kann nicht unterbrochen werden) usw. Wenn der Ressourcenwettbewerb nicht hart ist, ist die Leistung etwas schlechter als bei der Synchronisierung. Wenn die Synchronisierung jedoch sehr intensiv ist, kann die Leistung der Synchronisierung plötzlich um ein Dutzend Mal sinken. Und ReentrantLock kann tatsächlich die Normalität aufrechterhalten. Die Sperre wird durch Code implementiert, um sicherzustellen, dass die Sperre aufgehoben wird, muss unlock() in „finally{}“ platziert werden.
Atomar:
In weniger intensiven Situationen ist die Leistung etwas schlechter als bei synchronisierten Situationen, aber in intensiven Situationen kann die Normalität aufrechterhalten werden. In intensiven Situationen ist die Leistung von Atomic etwa doppelt so gut wie die von ReentrantLock.
1、synchronisierte Methode.
public synchronized void save(){}
2、synchronisierter Codeblock.
synchronized(object){ }
3、Verwenden Sie flüchtige Variablen.
Die Verwendung von volatile zum Ändern eines Felds entspricht der Anweisung an die virtuelle Maschine, dass das Feld möglicherweise von anderen Threads aktualisiert wird. Daher muss es jedes Mal neu berechnet werden, wenn das Feld verwendet wird, anstatt den Wert im Register zu verwenden.
4、Verwenden Sie die Reentrant Lock (ReenreantLock)
public void save(int money) { lock.lock(); try { account += money; } finally { lock.unlock(); } }
5、Verwenden Sie die ThreadLocal-Variable, dann erhält jeder Thread, der die Variable verwendet, eine Kopie der Variablen, und die Kopien sind unabhängig voneinander , sodass jeder Thread seine eigene Kopie der Variablen nach Belieben ändern kann, ohne andere Threads zu beeinträchtigen.
6、Verwenden Sie Blockierungswarteschlangen (LinkedBlockingQueue usw.)
7、Verwenden Sie atomare Variablen (AtomicInteger usw.)
Zusammenfassung:
synchronisiert:
Synchronisiert eignet sich sehr gut, wenn gelegentlich eine Synchronisierung erfolgt. Der Grund dafür ist, dass Compiler die Synchronisierung normalerweise so weit wie möglich optimieren. Synchronisiert wird auf JVM-Ebene implementiert. Synchronisierte Sperren können nicht nur durch einige Überwachungstools überwacht werden, sondern die JVM gibt die Sperre auch automatisch frei, wenn während der Codeausführung eine Ausnahme auftritt.
ReentrantLock:
ReentrantLock bietet eine Vielzahl von Synchronisierungen, z. B. zeitlich begrenzte Synchronisierung, unterbrechbare Synchronisierung (synchronisierte Synchronisierung kann nicht unterbrochen werden) usw. Wenn der Ressourcenwettbewerb nicht hart ist, ist die Leistung etwas schlechter als bei der Synchronisierung. Wenn die Synchronisierung jedoch sehr intensiv ist, kann die Leistung der Synchronisierung plötzlich um ein Dutzend Mal sinken. Und ReentrantLock kann tatsächlich die Normalität aufrechterhalten. Die Sperre wird durch Code implementiert, um sicherzustellen, dass die Sperre aufgehoben wird, muss unlock() in „finally{}“ platziert werden.
Atomar:
In weniger intensiven Situationen ist die Leistung etwas schlechter als bei synchronisierten Situationen, aber in intensiven Situationen kann die Normalität aufrechterhalten werden. In intensiven Situationen ist die Leistung von Atomic etwa doppelt so gut wie die von ReentrantLock.
Das obige ist der detaillierte Inhalt vonInformationen zur Java-Thread-Synchronisierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!