簡體   English   中英

當他們說StringBuffer類已同步時,這到底是什么意思? 是否已聲明該類的所有方法同步?

[英]What exactly does it mean when they say that StringBuffer class is synchronized? Are all methods of that class declared synchronized?

我知道StringBuffer類是同步的(或線程安全的),而StringBuilder不是。 這是否意味着StringBuffer中的所有方法(例如append)都用關鍵字sync聲明了?

我檢查了hava API: http ://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html

根據API,未使用關鍵字public StringBuffer append(String str)聲明public StringBuffer append(String str)方法。

誰能解釋?

synchronized關鍵字未顯示在生成的JavaDoc中,但是,如果打開StringBuffer的源代碼,則會看到每個可以更改實例狀態的公共方法實際上在其簽名中都帶有synchronized關鍵字。

public synchronized StringBuffer append(StringBuffer sb) {
    toStringCache = null;
    super.append(sb);
    return this;
}

正如評論中其他人提到的,static與線程安全性沒有直接關系。 如果您的意思是方法未使用synchronized關鍵字聲明,那么這應該可以回答您的問題。

“線程安全”是一個棘手的想法。

當有人說諸如StringBuffer之類的類是“線程安全的”時,它們通常意味着該類的實例在被多個線程訪問時不會以奇怪的,不可預料的方式表現。 例如,如果線程A嘗試在線程B附加“ green”的同時將“ yellow”附加到StringBuffer,則最終值可能是“ yellowgreen”,也可能是“ greenyellow”,但不會是“ yegrelleown”。 不會拋出IllegalStateException,並且不會使JVM崩潰。

這些保證使類線程的每個實例安全,但不會使程序線程安全。 如果您的程序中有一些線程C試圖同時讀取StringBuffer,則它可能會獲得上述兩個值之一,或者可能只是“黃色”,“綠色”,甚至是空字符串。 如果對於線程C而言,在字符串中同時看到兩個顏色名稱很重要,那么您將需要額外的同步以確保這種方式發生。

完全在“線程安全”類之外構建程序不會自動使整個程序成為“線程安全”。

正如其他答案已經告訴您的那樣,StringBuffer類通過使其所有方法都synchronized來實現線程安全,但這不是實現線程安全的唯一方法,在某些情況下,可能還不足以實現這一點。 如果您想知道什么是線程安全的,什么不是,請務必閱讀文檔。

另外,在閱讀它時,請注意該類的用途。 如果有人在某個特定用例中將某個類廣告宣傳為“線程安全”,那並不意味着在其他用例中它將是“線程安全”的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM