Ich habe die ganze Zeit gelesen, dass StringBuffer Thread sicher ist, aber ich habe nie verstanden, wie es implementiert ist. Ich sehe kein Schlüsselwort synchronized
in der Methodendefinition in der Dokumentation. Verwendet Java synchronized
Blöcke? Sind alle Methoden synchronized
? Ich glaube, dass nur die Methoden, die das zugrunde liegende Objekt aktualisieren, synchronized
sein sollten.Wie funktioniert die Synchronisation in StringBuffer?
Antwort
String-Puffer können mehrere Threads verwenden. Die Methoden werden bei Bedarf synchronisiert, sodass sich alle Vorgänge in einer bestimmten Instanz so verhalten, als ob sie in einer Reihenfolge auftreten, die der Reihenfolge der Methodenaufrufe der einzelnen beteiligten Threads entspricht.
Siehe https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html
Wenn Sie daran interessiert sind, wie dies im Detail umgesetzt wird, mit Quellcode, um die Oracle JDK installieren und direkt in StringBuffer.java oder look here for an Apache Licensed online version suchen.
Warum sind die Lesemethoden synchronisiert? Wie wirken sich Read-Methoden auf Multi-Thread-Operationen aus? Wenn ein Objekt aktualisiert wird (noch nicht fertig), dann würden die Lesemethoden einen alten Wert zurückgeben, der korrekt klingt. Warum beim Lesen eine Sperre erhalten? – noobCoder
@codeCrawler: Ich kann private Lese-Methode nur mit unter Signatur sehen: private void readObject (java.io.ObjectInputStream s) –
@Ravindrababu durch lesen ich meine Methoden wie, 'length() getChars()' sie sind synchronisiert! – noobCoder
StringBuffer
ist Thread-sicher. append
Methode ist synchronisiert.
Look here für weitere Details.
/**
* A thread-safe, mutable sequence of characters.
* A string buffer is like a {@link String}, but can be modified. At any
* point in time it contains some particular sequence of characters, but
* the length and content of the sequence can be changed through certain
* method calls.
* <p>
* String buffers are safe for use by multiple threads. The methods
* are synchronized where necessary so that all the operations on any
* particular instance behave as if they occur in some serial order
* that is consistent with the order of the method calls made by each of
* the individual threads involved.
public synchronized StringBuffer append(Object obj) {
super.append(String.valueOf(obj));
return this;
}
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
EDIT:
In Bezug auf Ihre Anfrage auf
, was passieren wird, wenn die getChars() während der Aktualisierung aufgerufen wird, geschieht, wird es gibt alten Wert oder was auch immer du bist pdated so weit?
die Antwort lautet:
getChars() wird warten, bis andere synchronisierte Methoden, um die Ausführung abzuschließen und Sperre wieder freigeben.
Wenn Sie sich auf den zweiten Absatz der Dokumentation beziehen, wird klar zitiert, dass sich Vorgänge so verhalten, als ob sie in der seriellen Reihenfolge auftreten.
- 1. Stringbuffer Kapazität()
- 2. Inner Synchronisation auf das gleiche Objekt wie die äußere Synchronisation
- 3. Max Größe für StringBuffer
- 4. Wie \ n wörtlich mit StringBuffer anhängen?
- 5. String kann nicht in StringBuffer konvertiert werden
- 6. Wie aktiviert man die vertikale Synchronisation in OpenGL?
- 7. StringBuffer/StringBuilder durch String ersetzen
- 8. CountDownLatch Synchronisation
- 9. Synchronisation in Vektoren in Java
- 10. Wie kann ich toLowerCase() nach der Verwendung eines StringBuffer verwenden?
- 11. Threading/Synchronisation
- 12. Java Synchronisation
- 13. Was ist ein wirkliches Beispiel für die Verwendung von StringBuffer?
- 14. Synchronisation zwischen Befehlspuffern in Vulkan
- 15. Thread-Synchronisation in SQL sicherstellen?
- 16. Multiplayer-Spiel-Synchronisation
- 17. Synchronisation in Threads für Java
- 18. Möglicher Speicherverlust, weil StringBuffer nicht verwendet wird?
- 19. Groovy Skript entfernen Newline von StringBuffer
- 20. Hybris: Synchronisation Cron-Job für Katalog-Web-Inhalte nicht funktioniert
- 21. hashtable und Synchronisation in Java
- 22. Ereignis Dispatching Thread-Synchronisation
- 23. Wie kann die Synchronisation s/w zwei Datenbanktabellen implementiert werden?
- 24. Javascript Event Synchronisation
- 25. VB.NET Synchronisation Verwirrung
- 26. Wie kann ich die Synchronisation meiner blockierenden Queue-Implementierung testen
- 27. Ist String thread sicher wie StringBuffer oder nicht?
- 28. StringBuffer-Methode Parameter - ändert sich nicht Wert
- 29. Rohr Anruf und Synchronisation
- 30. Java: StringBuffer zu Byte [] ohne toString
Die meisten Methoden sind "synchronisiert". Sie können dies erkennen, indem Sie den Code in Ihrer IDE öffnen. –
Siehe [Quellcode] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/StringBuffer.java). Ja, die meisten Methoden sind synchronisiert. – Aliaxander