看完這個之後 - What does 'synchronized' mean?我還是不明白爲什麼在線程安全的環境中StringBuffer會比StringBuilder慢。 StringBuffer需要做什麼額外的費時工作才能讓它變慢?「StringBuffer是同步的(或線程安全的)並且StringBuilder不是」,爲什麼這會使StringBuffer方法變慢?
3
A
回答
7
有一些小的開銷獲取和釋放甚至是無競爭的鎖,lock elision不會StringBuffer
工作,即使大多數情況下不使用跨線程,因爲一個實例可能是。
查看http://book.javanb.com/java-threads-3rd/jthreads3-CHP-5-SECT-1.html瞭解虛擬機在獲取和釋放鎖時必須執行的操作。
2
確保事物正在同步運行。或者,更重要的是,不同步。同步方法調用意味着該方法的兩個不同的調用(如果該對象不是靜態的,則該對象不得不輪流)進入該方法。在線程A(已經在方法中)完成之前,線程B不能輸入方法synchMeth。
檢查一個同步塊是否被鎖定,並由誰加入,花費額外的時間。
2
StringBuilder類提供的StringBuffer兼容的API 看了這個,但 沒有同步的保證。這個 類被設計用於替換字符串緩衝區 ,其中字符串緩衝區被使用 由單個線程(通常爲 的情況)在地點 替換爲字符串緩衝區。在可能的情況下,建議使用 這個類優先使用 StringBuffer,因爲在大多數實現中,它將更快地使用 。
您必須閱讀這篇文章StringBuffer vs. StringBuilder performance comparison
從版本JDK 5開始,此類已 已經由單一的 線程輔以等效 類專爲使用,{} StringBuilder的。 StringBuilder類一般應該優先使用 ,因爲 它支持所有相同的操作 但它更快,因爲它不執行 同步。
其他有用的鏈接:Difference between StringBuffer and StringBuilder class.
相關問題
- 1. Servlet的doFilter方法中的StringBuffer或StringBuilder?
- 2. 爲什麼使用StringWriter而不是StringBuffer?
- 3. 這個靜態方法使用哪個類,StringBuffer或StringBuilder?
- 4. StringBuffer vs StringBuilder
- 5. String,StringBuffer和StringBuilder
- 6. 爲什麼StringBuffer/StringBuilder不覆蓋equals或hashCode?
- 7. 爲什麼使用早於1.5的java版本中的StringBuilder替換StringBuffer對象是不安全的
- 8. 這是靜態方法線程安全或需要同步
- 9. 「這個方法不是線程安全的」是什麼意思?
- 10. StringBuffer vs StringBuilder VS StringTokenizer
- 11. StringBuilder和Stringbuffer有什麼區別?
- 12. Stringbuffer,Stringbuilder何時使用?
- 13. 爲什麼StringBuffer不會更改?
- 14. StringBuffer或StringBuilder用於我的查詢
- 15. 爲什麼EJB線程安全並且servlet不是?
- 16. 爲什麼StringBuffer允許StringBuffer作爲其構造函數的參數,即使StringBuffer沒有StringBuffer構造函數?
- 17. 什麼是需要將StringBuffer綁定到同步塊?
- 18. 爲什麼新的StringBuffer(新的StringBuilder(「foo」))能夠工作?
- 19. 爲什麼不讓StringBuilder和StringBuffer實現一個通用接口?
- 20. 爲什麼Java在StringBuilder更快時使用StringBuffer(synchronized)?
- 21. StringBuilder VS StringBuffer OR vector Vs ArrayList
- 22. StringBuffer或StringBuilder在Web應用程序中的使用DAO
- 23. 我應該使用StringBuilder還是StringBuffer作爲webapps?
- 24. 爲什麼存儲由replace()方法返回的StringBuffer對象不是必需的?
- 25. 如何在javac中默認強制使用StringBuffer而不是StringBuilder?
- 26. 同步方法不是線程安全的
- 27. 爲什麼要在Dart中使用StringBuffer而不是Iterable.join?
- 28. 使用同步的Java多線程不是線程安全的
- 29. 是.NET的StringBuilder的線程安全
- 30. 什麼意思是「sb.append(new StringBuffer(tx.nextToken())。reverse()+」「)」
你回答你自己的問題。 StringBuffer是同步的,所以它必須做更多的工作,而另一個人則必須做。在這種情況下更糟糕的是99%的時間不需要。 – 2011-06-09 14:02:24
...以及他鏈接到的線程非常多解釋了爲什麼同步的成本比沒有同步的代碼要多一點。 – Kaj 2011-06-09 14:05:46
既然上一個問題的重點不在於同步方法做了多少額外的工作,我不得不假設可能會有比答案中提到的更多的東西(爲了證明非常激烈的理由'不要使用StringBuffer,除非需要同步'我遇到的陳述)。下面所選的答案給出了我需要的信息。我認爲這個問題是合理的。 – 2011-06-10 08:56:04