Contents
Synchronisierte Methode & synchronisierter Block
Synchronisation ist die Möglichkeit, den Zugriff mehrerer Threads zu steuern, um Ressourcen gemeinsam zu nutzen. Ohne Synchronisation ist es für einen Thread möglich, eine gemeinsam genutzte Ressource zu ändern, während ein anderer Thread gerade diese Ressource verwendet oder aktualisiert.
In der Java-Sprache gibt es zwei Synchronisationssyntax. Die praktischen Unterschiede liegen im Kontrollumfang und im Monitor. Bei einem synchronisierten Verfahren wird die Sperre für die Dauer des gesamten Verfahrens erhalten. Bei synchronisierten Blöcken können Sie genau festlegen, wann die Sperre benötigt wird.
Grundsätzlich sind synchronisierte Blöcke allgemeiner und synchronisierte Methoden können umgeschrieben werden, um synchronisierte Blöcke zu verwenden. Wenn Sie also das gesamte Objekt sperren möchten, verwenden Sie eine synchronisierte Methode. Wenn Sie andere Teile des Objekts für andere Threads zugänglich halten möchten, verwenden Sie den synchronisierten Block.
Wenn Sie das gesperrte Objekt sorgfältig auswählen, führen synchronisierte Blöcke zu weniger Konflikten, da das gesamte Objekt/die gesamte Klasse nicht blockiert wird. Dies gilt ähnlich für statische Methoden, eine synchronisierte statische Methode erwirbt eine Sperre im gesamten Klassenobjekt, während ein synchronisierter Block innerhalb einer statischen Methode eine Sperre im Objekt zwischen Klammern erwirbt.
Der Hauptunterschied zwischen synchronisiertem Block und synchronisierter Methode besteht darin, dass synchronisierter Block den Code innerhalb des Blocks sperrt, während synchronisierte Methode das gesamte Objekt sperrt.
Was Sie über die synchronisierte Methode wissen müssen
- Die synchronisierte Methode erwirbt eine Sperre für das gesamte Objekt. Dies bedeutet, dass kein anderer Thread eine synchronisierte Methode im gesamten Objekt verwenden kann, während die Methode von einem Thread ausgeführt wird.
- Eine synchronisierte Methode verwendet den Methodenempfänger als Sperre, ‘this’ für nicht statische Methoden und die einschließende Klasse für statische Methoden.
- Die synchronisierte Methode sperrt immer entweder das aktuelle Objekt, das durch eine Sperre auf Klassenebene dargestellt wird, wenn es sich um eine statische synchronisierte Methode handelt.
- Im Fall einer synchronisierten Methode wird die Sperre vom Thread erworben, wenn er die Methode betritt, und freigegeben, wenn er die Methode verlässt, entweder normal oder durch Auslösen von Exception.
- Bei synchronisierten Methoden wird die Sperre im gesamten Methodenbereich aufrechterhalten.
- Eine synchronisierte statische Methode erwirbt eine Sperre im gesamten Klassenobjekt.
Was Sie über synchronisierten Block wissen müssen.
- Synchronisierte Blöcke erhalten eine Sperre im Objekt zwischen Klammern nach dem synchronisierten Schlüsselwort. Das bedeutet, dass kein anderer Thread eine Sperre für das gesperrte Objekt erlangen kann, bis der synchronisierte Block beendet wird.
- Synchronisierte Blöcke verwenden den Ausdruck als Sperre.
- Synchronisierte Blöcke bieten eine granulare Kontrolle über die Sperre, da Sie jede beliebige Sperre verwenden können, um einen gegenseitigen Ausschluss für kritischen Abschnittscode bereitzustellen.
- Im Falle eines synchronisierten Blocks erhält der Thread eine Sperre, wenn sie in den synchronisierten Block eintreten, und wird freigegeben, wenn sie den synchronisierten Block verlassen.
- Ein synchronisierter Block kann NullPointerException auslösen, wenn der als Parameter bereitgestellte Ausdruck null ergibt, was bei synchronisierten Methoden nicht der Fall ist.
- Im synchronisierten Block wird die Sperre nur während des Blockumfangs gehalten, der auch als kritischer Abschnitt bezeichnet wird.
- Ein synchronisierter Block innerhalb einer statischen Methode erhält eine Sperre im Objekt zwischen Klammern.
Unterschied zwischen synchronisierter Methode und Block in Tabellenform
SYNCHRONISIERTE METHODE | SYNCHRONISIERTER BLOCK |
Die synchronisierte Methode erwirbt eine Sperre für das gesamte Objekt. Dies bedeutet, dass kein anderer Thread eine synchronisierte Methode im gesamten Objekt verwenden kann, während die Methode von einem Thread ausgeführt wird. | Synchronisierte Blöcke erhalten eine Sperre im Objekt zwischen Klammern nach dem synchronisierten Schlüsselwort. Das bedeutet, dass kein anderer Thread eine Sperre für das gesperrte Objekt erlangen kann, bis der synchronisierte Block beendet wird. |
Eine synchronisierte Methode verwendet den Methodenempfänger als Sperre, ‘this’ für nicht statische Methoden und die einschließende Klasse für statische Methoden. | Synchronisierte Blöcke verwenden den Ausdruck als Sperre. |
Die synchronisierte Methode sperrt immer entweder das aktuelle Objekt, das durch eine Sperre auf Klassenebene dargestellt wird, wenn es sich um eine statische synchronisierte Methode handelt. | Synchronisierte Blöcke bieten eine granulare Kontrolle über die Sperre, da Sie jede beliebige Sperre verwenden können, um einen gegenseitigen Ausschluss für kritischen Abschnittscode bereitzustellen. |
Im Fall einer synchronisierten Methode wird die Sperre vom Thread erworben, wenn er die Methode betritt, und freigegeben, wenn er die Methode verlässt, entweder normal oder durch Auslösen von Exception. | Im Falle eines synchronisierten Blocks erhält der Thread eine Sperre, wenn sie in den synchronisierten Block eintreten, und wird freigegeben, wenn sie den synchronisierten Block verlassen. |
Bei synchronisierten Methoden wird die Sperre im gesamten Methodenbereich aufrechterhalten. | Im synchronisierten Block wird die Sperre nur während des Blockumfangs gehalten, der auch als kritischer Abschnitt bezeichnet wird. |
Eine synchronisierte statische Methode erwirbt eine Sperre im gesamten Klassenobjekt. | Ein synchronisierter Block innerhalb einer statischen Methode erhält eine Sperre im Objekt zwischen Klammern. |