So synchronisieren Sie String-Objekte in Java
Bei der Implementierung von Parallelität in Java ist es wichtig, die Konsequenzen der Synchronisierung auf verschiedene Typen von zu verstehen Objekte. In diesem Artikel wird ein häufiges Problem untersucht, das bei der Synchronisierung von String-Objekten auftritt, und Lösungen zur Gewährleistung einer effektiven Synchronisierung bereitgestellt.
Das bereitgestellte Szenario betrifft einen Webdienst, der einen Cache zum Speichern von Antworten verwendet bestimmte Endpunkte. Ziel war es sicherzustellen, dass nur ein Thread den Webdienst aufruft, wenn das zwischengespeicherte Objekt abgelaufen ist. Um dies zu erreichen, wurde der Code mit dem Cache-Schlüssel synchronisiert, der ein String-Objekt war. Allerdings schien die Synchronisierung nicht wie erwartet zu funktionieren, da mehrere Threads gleichzeitig in den Synchronisierungsblock eintraten.
Das Problem im Beispielcode besteht darin, dass Instanzen von String Objekte mit demselben Wert sind nicht unbedingt dasselbe Objekt. Daher wird beim Erstellen des Cache-Schlüssels mit String-Verkettung („Daten-“ E-Mail) für jeden Schlüssel ein neues String-Objekt erstellt. Dies bedeutet, dass der Code tatsächlich auf verschiedenen String-Objekten synchronisiert wurde, obwohl diese den gleichen Wert hatten.
Um dieses Problem zu lösen, kann die intern()-Methode für das String-Objekt verwendet werden. Die Methode intern() gibt die kanonische Darstellung der Zeichenfolge zurück, bei der es sich um eine einzelne Instanz handelt, die für alle Vorkommen dieser Zeichenfolge in der Java Virtual Machine (JVM) verwendet wird. Durch die Verwendung der kanonischen Darstellung werden alle Threads mit demselben String-Objekt synchronisiert, wodurch eine ordnungsgemäße Synchronisierung gewährleistet wird.
Der aktualisierte Code mit String-Internierung:
private SomeData[] getSomeDataByEmail(WebServiceInterface service, String email) { final String firstkey = "Data-" + email; final String key = firstkey.intern(); synchronized(key) { // Rest of the original code } }
Durch die Verwendung von intern(), um sicherzustellen, dass alle String-Objekte durch die kanonische Darstellung dargestellt werden, kann der Synchronisationsmechanismus im bereitgestellten Code wirksam gemacht werden. Es ist wichtig zu bedenken, dass die Synchronisierung auf verschiedenen Instanzen von Objekten mit demselben Wert zu Synchronisierungsfehlern führen kann und die Verwendung von intern() dazu beitragen kann, dieses Problem zu verhindern.
Das obige ist der detaillierte Inhalt vonWarum funktioniert die Synchronisierung von String-Objekten in Java nicht immer?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!