3

看完這個之後 - What does 'synchronized' mean?我還是不明白爲什麼在線程安全的環境中StringBuffer會比StringBuilder慢。 StringBuffer需要做什麼額外的費時工作才能讓它變慢?「StringBuffer是同步的(或線程安全的)並且StringBuilder不是」,爲什麼這會使StringBuffer方法變慢?

+2

你回答你自己的問題。 StringBuffer是同步的,所以它必須做更多的工作,而另一個人則必須做。在這種情況下更糟糕的是99%的時間不需要。 – 2011-06-09 14:02:24

+1

...以及他鏈接到的線程非常多解釋了爲什麼同步的成本比沒有同步的代碼要多一點。 – Kaj 2011-06-09 14:05:46

+0

既然上一個問題的重點不在於同步方法做了多少額外的工作,我不得不假設可能會有比答案中提到的更多的東西(爲了證明非常激烈的理由'不要使用StringBuffer,除非需要同步'我遇到的陳述)。下面所選的答案給出了我需要的信息。我認爲這個問題是合理的。 – 2011-06-10 08:56:04

回答

2

確保事物正在同步運行。或者,更重要的是,不同步。同步方法調用意味着該方法的兩個不同的調用(如果該對象不是靜態的,則該對象不得不輪流)進入該方法。在線程A(已經在方法中)完成之前,線程B不能輸入方法synchMeth。

檢查一個同步塊是否被鎖定,並由誰加入,花費額外的時間。

2

JavaDoc

StringBuilder類提供的StringBuffer兼容的API 看了這個,但 沒有同步的保證。這個 類被設計用於替換字符串緩衝區 ,其中字符串緩衝區被使用 由單個線程(通常爲 的情況)在地點 替換爲字符串緩衝區。在可能的情況下,建議使用 這個類優先使用 StringBuffer,因爲在大多數實現中,它將更快地使用 。

您必須閱讀這篇文章StringBuffer vs. StringBuilder performance comparison

從版本JDK 5開始,此類已 已經由單一的 線程輔以等效 類專爲使用,{} StringBuilder的。 StringBuilder類一般應該優先使用 ,因爲 它支持所有相同的操作 但它更快,因爲它不執行 同步。

其他有用的鏈接:Difference between StringBuffer and StringBuilder class.

相關問題