重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
synchronized
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:申請域名、網頁空間、營銷軟件、網站建設、港閘網站維護、網站推廣。
synchronized可以用來同步塊,同步方法。同步塊可以用來更精確地控制對象鎖,控制鎖的作用域。(鎖的作用域就是從鎖的獲得到鎖的釋放的時間,而且可以選擇獲取哪個對象的鎖)。但是在使用同步塊機制時,過多的使用鎖也會引發死鎖問題,同時獲取和釋放也有代價。
而同步方法,它所擁有的就是該類的對象,換句話說,就是this對象,而且鎖的作用域是整個方法,這可能導致鎖的作用域太大,有可能導致死鎖問題。同時也可能包括了不需要同步的代碼塊在內,也會降低程序的運行效率。
不管是同步方法還是同步塊,我們都不應該在里面包含無限循環,不然有可能導致獲得鎖之后,無限循環下去,無法釋放獲得的鎖資源,從而導致等待鎖的線程無法獲得,出現死鎖問題。
同步方法
非靜態同步方法
所有的非靜態同步方法使用的都是同一把鎖----實例對象本身,也就是說一個實例對象的非靜態方法獲得鎖之后,此對象的其他非靜態方法必須等待該方法釋放鎖之后才能獲取鎖,而這個類的其他對象可以被獲取,其他對象的非靜態方法使用的是不同的鎖
靜態同步方法
所有的靜態同步方法使用的都是同一把鎖---該類對象本身,這兩把鎖使用的是不同的對象,所以,類的非靜態方法和靜態方法之間不存在鎖競爭。但是一個類的靜態方法之間存在鎖競爭,
同步塊
鎖是可以選擇的,所以只有存在同一把鎖的同步塊才存在鎖競爭,注意!同步塊的鎖是可以選擇的,但不是可以任意選擇的(使用一個引用對象的實例變量不是一個好的選擇,因為同步塊在執行過程中,可能會改變它的值,比如設置為null,而對一個null對象加鎖會發生異常,并且對不同的對象加鎖也違背了使用鎖的初衷)
同步是基于對象而不是基于引用的,多個變量可以引用一個對象,變量也可以改變引用的對象,因此,我們要根據實例對象而不是引用來考慮!作為一個原則!永遠不要對一個可能再同步塊中改變其值的實例變量加鎖?。?!
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持創新互聯。