synchronized 修飾普通方法、靜態(tài)方法、代碼塊時(shí)的差異

????????Java多線程中的同步機(jī)制會(huì)對(duì)資源進(jìn)行加鎖,保證在同一時(shí)間只有一個(gè)線程可以操作對(duì)應(yīng)的資源,避免多線程同時(shí)訪問相同資源發(fā)生沖突。Synchronized是java中的關(guān)鍵字,它是一種同步鎖,可以實(shí)現(xiàn)同步機(jī)制。

1、修飾普通方法

輸出結(jié)果

????????可以看到第一個(gè)線程執(zhí)行完成了才會(huì)執(zhí)行第二個(gè)線程。如果沒有用synchronized修飾的話,結(jié)果會(huì)是兩個(gè)線程隨機(jī)調(diào)度。另外如果是多個(gè)線程不同對(duì)象訪問的該方法,則無(wú)法保證同步。例如這樣,

? ? 可以看到,這樣是無(wú)法保證同步的。

二,修飾靜態(tài)方法

????????修飾靜態(tài)方法, 由于靜態(tài)方法是類方法,? 所以這種情況下鎖的是包含這個(gè)方法的類,也就是類對(duì)象;這樣如果多個(gè)線程不同對(duì)象訪問該靜態(tài)方法,也是可以保證同步的。

另外如果是多個(gè)線程不同對(duì)象訪問的該方法,也同樣能保證同步

三,修飾?代碼塊?

????????修飾代碼塊 其中普通代碼塊 如Synchronized(obj) 這里的obj 可以為類中的一個(gè)屬性、也可以是當(dāng)前的對(duì)象,它的同步效果和修飾普通方法一樣;Synchronized方法 (obj.class)靜態(tài)代碼塊它的同步效果和修飾靜態(tài)方法類似。

Synchronized方法控制范圍較大, 它會(huì)同步對(duì)象中所有Synchronized方法的代碼。Synchronized代碼塊控制范圍較小, 它只會(huì)同步代碼塊中的代碼, 而位于代碼塊之外的代碼是可以被多個(gè)線程訪問的。簡(jiǎn)單來(lái)說 就是 Synchronized代碼塊更加靈活精確

這樣和直接修飾普通方法是沒有區(qū)別的。

4,?java中實(shí)現(xiàn)同步的還有l(wèi)ock,它跟?Synchronized的區(qū)別可以看這里java中實(shí)現(xiàn)同步的兩種方式:syschronized和lock的區(qū)別和聯(lián)系

另外volatile關(guān)鍵字也需要了解下,從多線程安全的角度說一下這個(gè)問題,每個(gè)線程都有自己獨(dú)立的工作空間,這個(gè)工作空間是為了存放被這個(gè)線程占用的資源,線程之間的工作空間不能共享,那么這樣會(huì)導(dǎo)致一個(gè)問題,被線程修改的數(shù)據(jù)沒有來(lái)得及從線程的工作空間刷新到主內(nèi)存中,導(dǎo)致數(shù)據(jù)的最新狀態(tài)不能達(dá)到同步的效果,volatile 就是為了解決這個(gè)問題而誕生的,被 volatile 關(guān)鍵字修飾的對(duì)象,一旦被修改之后會(huì)立馬刷新回到主內(nèi)存中,保證被其他線程訪問的時(shí)候是最新的數(shù)據(jù),但需要注意的是,?volatile?關(guān)鍵字不能解決線程安全的問題。大家可以自己去查,這里就不做過多解釋了。

最后編輯于
?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容