2016-05-14 25 views
-3

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?

+3

Die meisten Methoden sind "synchronisiert". Sie können dies erkennen, indem Sie den Code in Ihrer IDE öffnen. –

+2

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

Antwort

0

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.

+0

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

+0

@codeCrawler: Ich kann private Lese-Methode nur mit unter Signatur sehen: private void readObject (java.io.ObjectInputStream s) –

+0

@Ravindrababu durch lesen ich meine Methoden wie, 'length() getChars()' sie sind synchronisiert! – noobCoder

0

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.