Synchronisiert verwenden - 1

„Hallo, Amigo!“

„Ja, ich bin hier, ich bin hier.“

„Heute erzähle ich Ihnen von der Verwendung der Synchronisierung in der Praxis.“

„Wenn ein Programm viele Objekte und Threads hat, kommt es oft vor, dass mehrere Threads gleichzeitig mit demselben Objekt arbeiten. Dabei stören sich die Threads gegenseitig.“

„Ja, das weiß ich schon.“

„Angenommen, Sie haben ein Objekt, auf das mehrere Threads zugreifen. Sie können zwei Dinge tun, um Probleme zu vermeiden.“

„Die erste besteht darin, synchronisierte Blöcke zu verwenden, um jeden Ort zu umschließen, an dem auf das Objekt zugegriffen wird. Dieser Ansatz funktioniert jedoch möglicherweise nicht, wenn ein Programmierer Code schreibt, der direkt auf das Objekt zugreift, ohne einen synchronisierten Block.“

„Daher wird meistens ein zweiter Ansatz verwendet – das Objekt threadsicher machen.“ „Mit anderen Worten, der synchronisierte Mechanismus ist in das Objekt selbst integriert: Er deklariert seine Methoden als synchronisiert und/oder verpackt den Code innerhalb seiner Methoden in synchronisierten Blöcken.“

„Also muss ich jedes Objekt, das ich aus mehreren Threads verwenden könnte, und das sind fast alle Objekte im Programm, threadsicher machen?“

„Im Allgemeinen ja. In der Realität werden nicht alle Objekte in einem Programm von verschiedenen Threads verwendet, aber normalerweise sind es viele. Wenn Sie also anfangen, Code für einen Thread zu schreiben und von dort aus auf verschiedene Objekte zugreifen, dann bei jedem Methodenaufruf Sie sollten sich fragen: „Ist dieser Anruf sicher?“

"Sicher?"

„Thread-sicher, was bedeutet, dass es sicher von mehreren Threads aufgerufen werden kann.“

„Hier sind einige Beispiele. Angenommen, Sie haben ein String-Objekt, auf das von verschiedenen Threads aus zugegriffen wird. Wie Sie sich bereits erinnern sollten, ist String unveränderlich – wie alle anderen primitiven Typen. Das bedeutet, dass sich ein Objekt nach seiner Erstellung nicht ändert . Das bedeutet, dass es unmöglich ist, ein solches Objekt zu „zerstören“. Alle unveränderlichen Objekte sind threadsicher.“

„Nun, das macht die Sache einfacher.“

„Angenommen, Sie benötigen eine veränderbare Zeichenfolge.“

„Ja, ich erinnere mich. Es gibt zwei Arten solcher Strings: StringBuffer und StringBuilder. StringBuffer ist wie StringBuilder, aber alle seine Methoden sind synchronisiert. Ist es auch Thread-sicher?“

"Ja. Wenn Sie von mehreren Threads aus auf ein StringBuilder-Objekt zugreifen müssen, müssen Sie es durch einen StringBuffer ersetzen. Andernfalls werden die Threads es früher oder später gleichzeitig ändern und „kaputtmachen“.

„Was ist, wenn das Objekt, auf das von verschiedenen Threads zugegriffen wird, ein Objekt meiner eigenen Klasse ist? Muss ich in diesem Fall auch synchronisiert zu seinen Methoden hinzufügen?“

„Ja. Am besten befolgen Sie diese Regel: Alle Objekte, auf die von verschiedenen Threads aus zugegriffen wird, müssen Thread-sicher sein.“

„Ich verstehe. Ich hätte nicht gedacht, dass alles so ernst ist. Danke, Ellie.“

„Gern geschehen. Ich hoffe, diese Tipps helfen dir, wenn Diego dir ein paar seiner einfachen Aufgaben gibt. ☺“