依據(jù)情況的不同,過度同步可能會(huì)導(dǎo)致性能降低、死鎖,甚至不確定的行為。
為了避免活性失敗和安全性失敗,在一個(gè)被同步的方法或者代碼塊中,永遠(yuǎn)不要放棄對(duì)客戶端的控制。換句話說,在一個(gè)被同步的區(qū)域內(nèi)部,不要調(diào)用設(shè)計(jì)成要被覆蓋的方法,或者是由客戶端以函數(shù)對(duì)象的形式提供的方法。從包含該同步區(qū)域的角度來看,這樣的方法是外來的(alien)。這個(gè)類不知道該方法會(huì)做什么事情,也無法控制它。根據(jù)外來方法的作用,從同步區(qū)域中調(diào)用它會(huì)導(dǎo)致異常、死鎖或者數(shù)據(jù)損壞。通常,你應(yīng)該在同步區(qū)域內(nèi)做盡可能少的工作。
如果一個(gè)可變類要并發(fā)使用,應(yīng)該使這個(gè)類變成線程安全的,通過內(nèi)部同步,你還可以獲得明顯比外部鎖定整個(gè)對(duì)象更高的并發(fā)性。否則,就不要在內(nèi)部同步。讓客戶在必要的時(shí)候從外部同步。(StringBuffer實(shí)例幾乎總是被用于單個(gè)線程中,而它們執(zhí)行的卻是內(nèi)部同步。因此,這種StringBuffer都應(yīng)該用StringBuilder代替。)
簡而言之,為了避免死鎖和數(shù)據(jù)破壞,千萬不要從同步區(qū)域內(nèi)部調(diào)用外來方法。更為一般地講,要盡量限制同步區(qū)域內(nèi)部的工作量。當(dāng)你在設(shè)計(jì)一個(gè)可變類的時(shí)候,要考慮一下它們是否應(yīng)該自己完成同步操作。在現(xiàn)在這個(gè)多核的時(shí)代,這比永遠(yuǎn)不要過度同步來得更重要。只有當(dāng)你有足夠的理由一定要在內(nèi)部同步類的時(shí)候,才應(yīng)該這么做,同時(shí)還應(yīng)該將這個(gè)決定清楚地寫到文檔中。
第67條 避免過度同步
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
- java 接口的意義-百度 規(guī)范、擴(kuò)展、回調(diào) 抽象類的意義-樂視 為其子類提供一個(gè)公共的類型封裝子類中得重復(fù)內(nèi)容定...
- Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
- 前言 做Android開發(fā)這么多年,見過很多人寫的代碼(開源代碼除外),其中有的寫的代碼很簡潔、很漂亮,讓人看起來...