併發程式設計——synchronized關鍵字的使用

超Code發表於2021-08-12

前言

我們一般對共享資料操作的時候,為了達到執行緒安全我們會使用synchronized關鍵字去修飾方法或者程式碼塊。那麼今天我們就來講一講synchronized關鍵字的使用。

專欄推薦:
併發程式設計專欄

synchronized的使用

synchronized的使用可以修飾程式碼塊,也可以修飾物件方法,以及靜態方法。不過這些修飾的本質實質就只是鎖的資源不同,一種是物件,一種是類。

修飾程式碼塊

錯誤程式碼:this,物件鎖

當我們使用不同例項物件去呼叫方法的時候會發現結果並不是我們想象的20000,因為this這個指代的是當前物件,因為是兩個不同的物件,所以使用this是鎖不住的。
看一下執行結果:

只有使用相同的物件的時候,才可以。所以不推薦使用this,而是使用固定的物件去作為鎖,才能夠鎖住。

相同例項物件的執行結果:

下面我們使用一個初始化好的一個例項物件作為物件鎖。(useSynchronized)

使用不同的物件去呼叫也沒有問題,因為物件鎖是初始化好的一個例項物件useSynchronized作為物件鎖

執行結果正確:

修飾物件方法

[圖片上傳中...(物件方法main.png-d41e8a-1628781214368-0)]

修飾物件方法,這個就和程式碼塊中使用物件鎖一樣,因為synchronized修飾在物件方法上,所以它實質是等於程式碼塊中使用this,因為一個類可以有很多例項物件,所以這個是鎖不住的。

執行結果有問題,未能鎖住:

修飾靜態方法

修飾靜態方法,這個就和程式碼塊中使用類鎖一樣,因為synchronized修飾在靜態方法上,所以它實質是等於程式碼塊中使用當前這個類的class,不管你一個類有多少個例項物件,你只有一個class,類鎖是唯一的就不會出現多執行緒同時執行方法的現象。

執行結果,和我們預想的一樣20000:

總結一下:

1、synchronized修飾物件方法,如果是不同的物件呼叫這個方法,是不能啟動任何控制作用的。synchronized修飾程式碼塊時,如果鎖資源使用的是this,那麼就和synchronized修飾物件方法一樣,因為一個類可以有多個例項物件,每個例項物件都不一樣,就相當於一個門,有多個鑰匙,誰都可以進入。所以我們使用synchronized修飾程式碼塊時,我們需要宣告一個唯一的鑰匙,比如我們上面的程式碼,先建立一個靜態的例項物件,使用它當作這個門的唯一鑰匙,就可以保證多個執行緒,不會同時進入方法內執行。

2、synchronized修飾靜態方法,就比較簡單了,我們直接使用某一個類的class,它就可以實現一個唯一性,不管是這個類的多少個例項物件,這些物件對應的class只有一個。所以是可以實現多執行緒操作共享資源,不會有問題。那麼當我們synchronized修飾程式碼塊時,使用的是類鎖的話,那就很簡單了,唯一的類鎖,和修飾靜態方法一樣。

感謝諸君的觀看,文中如有紕漏,歡迎在評論區來交流。如果這篇文章幫助到了你,歡迎點贊?關注。

相關文章