1. 程式人生 > >避免過度同步。

避免過度同步。

依據情況的不同,過度同步可能會導致效能降低、死鎖,甚至不確定的行為。

為了避免活性失敗和安全性失敗,在一個被同步的方法或者程式碼塊中,永遠不要放棄對客戶端的控制。換句話說,在一個被同步的區域內部,不要呼叫設計成要被覆蓋的方法,或者是由客戶端以函式物件的形式提供的方法。從包含該同步區域的類的角度來看,這樣的方法是外來的。這個類不知道該方法會做什麼事情,也無法控制它。根據外來方法的作用,從同步區域中呼叫他會導致異常、死鎖或者資料損壞。

假設當同步區域所保護的約束條件暫時無效時,你要從同步區域中呼叫一個外來方法。由於Java程式設計語言中的鎖是可重入的,這種呼叫不會死鎖。他會產生一個異常,因為呼叫執行緒已經有這個鎖了,因此當該執行緒試圖再次獲得該鎖時會成功,儘管概念上不相關的另一項操作正在該鎖保護的資料上進行著。這種失敗的後果可能是災難的。從本質上來說,這個鎖沒有盡到它的職責。可再入的鎖簡化了多執行緒的面向物件程式的構造,但是他們可能會將活性失敗變成安全性失敗。

事實上,要將外來方法的呼叫移出同步的程式碼塊。還有一種更好地方法。自從Java 1.5發行版本以來,Java類庫就提供了一個併發集合,稱作CopyOnWriteArrayLIst,這是專門為此定製的。這是ArrayList的一種變種,通過重新拷貝整個底層陣列,在這裡實現所有的寫操作。由於內部陣列永遠不改動,因此迭代不需要鎖定,速度也非常快。如果大量使用,CopyOnWriteArrayList的效能將大受影響,但是對於觀察者列表來說卻是很好的,因為他們幾乎不改動,並且經常被遍歷。

在同步區域之外被呼叫的外來方法被稱作“開放呼叫”。除了可以避免死鎖之外,開放呼叫還可以極大地增加併發性。外來方法的執行時間可能會任意長。如果在同步區域內呼叫外來方法,其他執行緒對受保護資源的訪問就會遭到不必要的拒絕。

通常,你應該在同步區域內做盡可能少的工作。獲得鎖,檢查共享資料,根據需要轉換資料,然後放掉鎖。如果你必須要執行某個很耗時的動作,則應該設法把這個動作移到同步區域的外面。

雖然自從Java平臺早期以來,同步的成本已經下降了,但更重要的是,永遠不要過度同步。在這個多核的時代,過度同步的實際成本並不是指獲取鎖所花費的CPU時間;而是指失去了並行的機會,以及因為需要確保每個核都有一個一致的記憶體檢視而導致的延遲。過度同步的另一項潛在開銷在於,他會限制VM優化程式碼執行的能力。

如果一個可變的類要併發使用,應該使這個類變成是執行緒安全的,通過內部同步,你還可以獲得明顯比從外部鎖定整個物件更高的開發性。否則,就不要在內部同步。讓客戶在必要的時候從外部同步。在Java平臺出現的早期,許多類都違背了這些指導方針。當你不確定的時候,就不要同步你的類,而是應該建立文件,註明它不是執行緒安全的。

如果你的內部同步了類,就可以使用不同的方法來實現高併發性,例如分拆鎖、分離鎖和非阻塞併發控制。

如果方法修改了靜態域,那麼你也必須同步對這個域的訪問,即使他往往只用於單個執行緒。客戶要在這種方法上執行外部同步時不可能的,因為不可能保證其他不想關的客戶也會執行外部同步。

簡而言之,為了避免死鎖和資料破壞。千萬不要從同步區域內部呼叫外來方法。更為一般的講,要儘量限制同步區域內部的工作量。當你在設計一個可變類的時候,要考慮一下他們是否應該自己完成同步操作。在現在這個多核的時代,這比永遠不要過度同步來得更重要。只有當你有足夠的理由一定要在內部同步類的時候,才應該這麼做,同時還應該將這個決定清楚地寫到文件中。

相關推薦

避免過度同步

依據情況的不同,過度同步可能會導致效能降低、死鎖,甚至不確定的行為。 為了避免活性失敗和安全性失敗,在一個被同步的方法或者程式碼塊中,永遠不要放棄對客戶端的控制。換句話說,在一個被同步的區域內部,不要呼叫設計成要被覆蓋的方法,或者是由客戶端以函式物件的形式提供的方法。從包含

避免過度同步(67)

過度使用同步會導致效能低下、死鎖或其他不確定問題 在一個同步方法或程式碼塊中,不要放棄對客戶端的控制 即:在一個同步區域內部,不要呼叫被覆蓋方法,或者是傳入物件提供的方法  這些外來方法不可控,會帶來各種問題 為了避免死鎖和資料破壞,千萬不要從同步區域內部呼叫

第六十七條 避免過度同步

上一條,我們知道了併發中要對資料進行安全性保護,防止資料出錯,一般是進行同步保護,但做事情不能從一個極端走向另外一個極端,在同步保護的同時,要注意防止過度同步,因為它會導致效能下降、死鎖,甚至是其他的一些不確定行為。本條目中的一個醒目觀點就是,如果一個方法被同步了,那麼,這個同步方法裡涉及的有其他方

避免過度同步(筆記)

簡述: 《Effective Java》第67條避免過度同步 知識點: 1. synchronized 集合的時候,刪除集合元素出現,併發修改和死鎖的問題 2. CopyOnWriteArray, 一種在寫操作時都會進行拷貝的併發集合(concurrent collect

同步 SVNStatusSubscriber 時報告了錯誤1 中的 0 個資源已經同步

錯誤提示 同步 SVNStatusSubscriber 時報告了錯誤。1 中的 0 個資源已經同步。 同步 /fdczzxt 時發生錯誤:Error getting status for resource P/fdczzxt org.apache.subversion.javahl

【享受技術帶來的快樂】目標賦予我們生命的意義和目的有了目標,我們才會把注意力集中在追求喜悅,而不是在避免痛苦上

如果您認為本部落格不錯,讀後覺得有收穫,不妨打賞讚助我一下,讓我有動力繼續寫出高質量的部落格。 贈人玫瑰,手有餘香。分享技術,傳遞快樂。 有心課堂,傳遞的不僅僅是技術! QQ交流群:250468947 有心課堂會員,請加入VIP QQ交流

分享兩種外鏈跳轉方法,可避免權重流失

前 2 天,在修改互推聯盟自適應頁面時,考慮到原先的跳轉機制可能會對博友造成困擾,所以想修改成直接跳轉模式,徹底拋棄之前強行重寫 title 即 iframe 框架的不友好機制。 下面的內容是在研究外鏈跳轉時發現的,感覺還不錯,就拿來分享一下! 你或許看見過類似 http://www.***.com/go.

【C#】使用Dapper對SqlServer與Sqlite3進行雙向同步

場景 Sqlserver主資料庫部署於伺服器,Sqlite3充當應用程式的快取。Sqlserver與Sqlite3是一對多的關係。 常用操作為Sqlserver資料同步至Sqlite3。偶爾會出現反向同步。 兩個資料庫表結構相同。因業務需求,對應的DTO結構多出一些欄位

執行緒間無需特別的手段進行通訊,因為執行緒間可以共享資料結構,也就是一個全域性變數可以被兩個執行緒同時使用,不過要注意的是執行緒間需要做好同步

     執行緒間無需特別的手段進行通訊,因為執行緒間可以共享資料結構,也就是一個全域性變數可以被兩個執行緒同時使用。不過要注意的是執行緒間需要做好同步,一般用mutex。可以參考一些比較新的UNIX/Linux程式設計的書,都會提到Posix執行緒程式設計,比如《UNIX

避免過度繪製的解決方法

檢測過度繪製:進入設定 -> 開發者選項 -> 除錯GPU過度繪製 -> 顯示GPU過度繪製 提示色值:真實對比: 藍色,淡綠,淡紅,深紅代表了4種不同程度的Overdraw情

hander同步技巧 利用post之後的訊息是最後完成的,實現同步關鍵看waitDone的實現帶面精簡Camera應用

private void testWait(){ HandlerThread ht = new HandlerThread("Camera Handler Thread"); ht.start(); mCameraHandler

005-優化web請求一-gzip壓縮、http緩存控制和緩存校驗[Pragma、Expires、Cache-Control、max-age、Last-Modified、用戶刷新訪問、避免過度304]

無法 新鮮度 開發者模式 請求報文 XML 自定義 server clas 存在   優化Web應用的典型技術:緩存控制頭信息、Gzip、應用緩存、ETag、反應型技術【異步方法調用和WebSocket】 一、模板緩存 spring.thymeleaf.cache=

如何避免過度繪製

1. 儘量多使用RelativeLayout和LinearLayout, 不要使用絕對佈局AbsoluteLayout, 1. 在佈局層次一樣的情況下, 建議使用LinearLayout代替RelativeLayout, 因為LinearLayout效能要稍高一點. 2

避免過度設計

  許多文章都在強調不要過度設計自己的系統,但是沒有道出個所以然來,所以本文列出一些經典的過度設計,希望能給你帶來啟發,在工程上做一些平衡,避免過度設計把我們推到另外一個複雜度上  1、Engineering is more clever than Business 工程師通常認為自己

Rsync:非常實用的同步文件命令

作文件 sub pin www force 文件的 write 傳輸文件 修改 rsync命令是一個遠程數據同步工具,一般企業用作文件定時同步目錄,代碼發布等功能。1.rsync分為服務端和客戶端,兩端都需要安裝rsync服務。 yum -y install rsync 編

避免網站過度優化

優化談了不少具體的SEO技巧,做網站優化的朋友還要註意一點,那就是千萬不要過度優化網站。  同樣這又是一個度和平衡的問題。  做SEO的人應該了解所有可以被優化的地方,應該了解怎樣優化這些地方,但同時也應該了解不能同時優化所有這些地方,不然網站很容易被某種形式的懲罰。  典型的過度優化的網站特征包括:  外部

有感於微課數據同步多次 也與雲上的不一致問題,大家的思路不清楚是主要原因

bre get 數據 star enc 不一致 ble spa into import requests import json # pip install requests scheme_id=105887 start_num=0 limit_count

ajax同步請求時,google瀏覽器崩潰改用Deferred

回調 概念 解決 但是 category hid 意思 val ret jQuery的開發速度很快,幾乎每半年一個大版本,每兩個月一個小版本。 每個版本都會引入一些新功能。今天我想介紹的,就是從jQuery 1.5.0版本開始引入的一個新功能----deferred對象。

它是個黑盒,無法解釋的黑盒;它避免了我們的或者某種來源的先驗強加於陌生人:另外一個黑盒

陌生人 基於 解決 們的 解決辦法 通過 最大 當下 汽車 @Matthew?【[抱拳]】推薦系統中,傳統的兩大算法,無論是基於人的過濾,還是基於物品的過濾,在前期歷史數據的量和質都不充足的情況下,這兩種傳統的算法都無法冷啟動。 【基於ANN的一種解決辦法】

過度加班? - 是該到了認真考慮的時候了

而且 心態 慢慢 是個 喜歡 自己的 商品 別人 錯誤 相信很多搞技術的IT企業都會有過度加班的情況,而且相信大部分企業沒有加班費用什麽的;換句話說,在加班上,企業付出的成本是很低的,這也是很多企業喜歡加班的理由吧,甚至於有些企業還對自己的加班文化津津樂道。對員工而