JavaRush /Java-Blog /Random-DE /Thread-Synchronisation, Objektsperre und Klassensperre
CynepHy6
Level 34
Великий Новгород

Thread-Synchronisation, Objektsperre und Klassensperre

Veröffentlicht in der Gruppe Random-DE
Thread-Synchronisation, Objektsperre und Klassensperre – 1Synchronisation 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 synchronizedin 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 sind DemoClass, 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

  1. Durch die Synchronisierung in Java wird sichergestellt, dass keine zwei Threads gleichzeitig oder parallel eine synchronisierte Methode ausführen können.

  2. synchronizedkann nur mit Methoden und Codeblöcken verwendet werden. Diese Methoden oder Blöcke können statisch oder nicht statisch sein.

  3. 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.

  4. synchronizedIn 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.

  5. Синхронизация в Java будет бросать NullPointerException если ein Objekt используемый в синхронизированном блоке null. Например, в вышеприведенном примере Codeа, если замок инициализируется Wie null, синхронизированный (lock) бросит NullPointerException.

  6. Синхронизированные методы в Java вносят дополнительные затраты на производительность вашего Anwendungen. Так что используйте синхронизацию, когда она абсолютно необходима. Кроме того, рассмотрите вопрос об использовании синхронизированных блоков Codeа для синхронизации только критических секций Codeа.

  7. Вполне возможно, что и статический и не статический синхронизированные методы могут работать одновременно oder параллельно, потому что они захватывают замок на другой ein Objekt.

  8. В соответствии со спецификацией языка вы не можете использовать synchronized в конструкторе это приведет к ошибке компиляции.

  9. Не синхронизируйте по не финальному (no final) полю, потому что Verknüpfung, на не финальное поле может измениться в любое время, а затем другой поток может получить синхронизацию на разных ein Objektах и уже не будет ниWieой синхронизации вообще. Лучше всего использовать класс String, который уже неизменяемый и финальный.

Удачи в обучении!! Оригинал: Object level lock vs Class level lock in Java
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION