您好,登錄后才能下訂單哦!
synchronized
synchronized可以用來同步塊,同步方法。同步塊可以用來更精確地控制對象鎖,控制鎖的作用域。(鎖的作用域就是從鎖的獲得到鎖的釋放的時間,而且可以選擇獲取哪個對象的鎖)。但是在使用同步塊機制時,過多的使用鎖也會引發(fā)死鎖問題,同時獲取和釋放也有代價。
而同步方法,它所擁有的就是該類的對象,換句話說,就是this對象,而且鎖的作用域是整個方法,這可能導致鎖的作用域太大,有可能導致死鎖問題。同時也可能包括了不需要同步的代碼塊在內(nèi),也會降低程序的運行效率。
不管是同步方法還是同步塊,我們都不應該在里面包含無限循環(huán),不然有可能導致獲得鎖之后,無限循環(huán)下去,無法釋放獲得的鎖資源,從而導致等待鎖的線程無法獲得,出現(xiàn)死鎖問題。
同步方法
非靜態(tài)同步方法
所有的非靜態(tài)同步方法使用的都是同一把鎖----實例對象本身,也就是說一個實例對象的非靜態(tài)方法獲得鎖之后,此對象的其他非靜態(tài)方法必須等待該方法釋放鎖之后才能獲取鎖,而這個類的其他對象可以被獲取,其他對象的非靜態(tài)方法使用的是不同的鎖
靜態(tài)同步方法
所有的靜態(tài)同步方法使用的都是同一把鎖---該類對象本身,這兩把鎖使用的是不同的對象,所以,類的非靜態(tài)方法和靜態(tài)方法之間不存在鎖競爭。但是一個類的靜態(tài)方法之間存在鎖競爭,
同步塊
鎖是可以選擇的,所以只有存在同一把鎖的同步塊才存在鎖競爭,注意!同步塊的鎖是可以選擇的,但不是可以任意選擇的(使用一個引用對象的實例變量不是一個好的選擇,因為同步塊在執(zhí)行過程中,可能會改變它的值,比如設(shè)置為null,而對一個null對象加鎖會發(fā)生異常,并且對不同的對象加鎖也違背了使用鎖的初衷)
同步是基于對象而不是基于引用的,多個變量可以引用一個對象,變量也可以改變引用的對象,因此,我們要根據(jù)實例對象而不是引用來考慮!作為一個原則!永遠不要對一個可能再同步塊中改變其值的實例變量加鎖!?。?/p>
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。