Synchronisation bezieht sich auf Multithreading. Ein synchronisierter Codeblock kann jeweils nur von einem Thread ausgeführt werden. Java unterstützt mehrere Threads zur Ausführung. Dies könnte dazu führen, dass zwei oder mehr Threads auf dasselbe Feld oder Objekt zugreifen. Synchronisation ist ein Prozess, der es allen parallelen Threads in einem Programm ermöglicht, synchron zu laufen. Durch die Synchronisierung werden Speicherkonsistenzfehler vermieden, die durch inkonsistenten Zugriff auf den gemeinsam genutzten Speicher verursacht werden. Wenn eine Methode als synchronisiert deklariert wird, enthält der Thread einen Monitor für das Objekt, dessen Methode ausgeführt wird. Wenn ein anderer Thread eine synchronisierte Methode ausführt, wird Ihr Thread blockiert, bis der andere Thread den Monitor freigibt. Die Synchronisierung wird in Java über ein reserviertes Wort erreicht
synchronized
. Sie können es in Ihren Klassen verwenden, indem Sie synchronisierte Methoden oder Blöcke definieren. Sie können synchronized
in einer Klassendefinition keine Variablen oder Attribute verwenden.
Sperren auf Objektebene
Dies ist ein Mechanismus zum Synchronisieren einer nicht statischen Methode oder eines nicht statischen Codeblocks, sodass nur ein Thread einen bestimmten Block oder eine bestimmte Methode für eine bestimmte Instanz einer Klasse ausführen kann. Dies sollte immer dann erfolgen, wenn Sie Daten-Threads auf Instanzebene sicher machen müssen. Beispiel:public class DemoClass{
public synchronized void demoMethod(){}
}
oder
public class DemoClass{
public void demoMethod(){
synchronized (this) {
//other thread safe code
}
}
}
oder
public class DemoClass{
private final Object lock = new Object();
public void demoMethod(){
synchronized (lock) {
//other thread safe code
}
}
}
Sperren auf Klassenebene
Verhindert, dass mehrere Threads während der Ausführung in einer der verfügbaren Instanzen der Klasse in einen synchronisierten Block eintreten. Dies bedeutet, dass, wenn während der Programmausführung 100 Instanzen der Klasse vorhanden sindDemoClass
, in jedem dieser Fälle nur ein Thread zu diesem Zeitpunkt ausgeführt werden kann demoMethod()
und alle anderen Fälle für andere Threads blockiert werden. Dies ist erforderlich, wenn Sie statische Datenthreads sicher machen müssen.
public class DemoClass{
public synchronized static void demoMethod(){}
}
oder
public class DemoClass{
public void demoMethod(){
synchronized (DemoClass.class) {
//other thread safe code
}
}
}
oder
public class DemoClass
{
private final static Object lock = new Object();
public void demoMethod(){
synchronized (lock) {
//other thread safe code
}
}
}
Einige wichtige Hinweise
- Durch die Synchronisierung in Java wird sichergestellt, dass keine zwei Threads gleichzeitig oder parallel eine synchronisierte Methode ausführen können.
synchronized
kann nur mit Methoden und Codeblöcken verwendet werden. Diese Methoden oder Blöcke können statisch oder nicht statisch sein.- Immer wenn ein Thread eine synchronisierte Methode oder einen synchronisierten Block betritt, erhält er eine Sperre, und wenn ein Thread eine synchronisierte Methode oder einen synchronisierten Block verlässt, gibt die JVM die Sperre frei. Die Sperre wird auch dann aufgehoben, wenn der Thread die synchronisierte Methode nach Abschluss aufgrund von Fehlern oder Ausnahmen verlässt.
synchronized
In Java bedeutet dies , dass, wenn eine synchronisierte Methode eine andere synchronisierte Methode aufruft, die dieselbe Sperre erfordert, der aktuelle Thread, der die Sperre hält, diese Methode betreten kann, ohne die Sperre zu erwerben.- Синхронизация в Java будет бросать
NullPointerException
если ein Objekt используемый в синхронизированном блоке null. Например, в вышеприведенном примере Codeа, если замок инициализируется Wienull
, синхронизированный (lock) броситNullPointerException
. - Синхронизированные методы в Java вносят дополнительные затраты на производительность вашего Anwendungen. Так что используйте синхронизацию, когда она абсолютно необходима. Кроме того, рассмотрите вопрос об использовании синхронизированных блоков Codeа для синхронизации только критических секций Codeа.
- Вполне возможно, что и статический и не статический синхронизированные методы могут работать одновременно oder параллельно, потому что они захватывают замок на другой ein Objekt.
- В соответствии со спецификацией языка вы не можете использовать
synchronized
в конструкторе это приведет к ошибке компиляции. - Не синхронизируйте по не финальному (no final) полю, потому что Verknüpfung, на не финальное поле может измениться в любое время, а затем другой поток может получить синхронизацию на разных ein Objektах и уже не будет ниWieой синхронизации вообще. Лучше всего использовать класс
String
, который уже неизменяемый и финальный.
GO TO FULL VERSION