咱們通常對共享數據操做的時候,爲了達到線程安全咱們會使用synchronized關鍵字去修飾方法或者代碼塊。那麼今天咱們就來說一講synchronized關鍵字的使用。編程
專欄推薦:
併發編程專欄安全
synchronized的使用能夠修飾代碼塊,也能夠修飾對象方法,以及靜態方法。不過這些修飾的本質實質就只是鎖的資源不一樣,一種是對象,一種是類。多線程
錯誤代碼:this,對象鎖
併發
當咱們使用不一樣實例對象去調用方法的時候會發現結果並非咱們想象的20000,由於this這個指代的是當前對象,由於是兩個不一樣的對象,因此使用this是鎖不住的。
看一下執行結果:
this
只有使用相同的對象的時候,才能夠。因此不推薦使用this,而是使用固定的對象去做爲鎖,纔可以鎖住。
線程
相同實例對象的執行結果:
3d
下面咱們使用一個初始化好的一個實例對象做爲對象鎖。(useSynchronized)對象
使用不一樣的對象去調用也沒有問題,由於對象鎖是初始化好的一個實例對象useSynchronized做爲對象鎖
blog
執行結果正確:
圖片
[圖片上傳中...(對象方法main.png-d41e8a-1628781214368-0)]
修飾對象方法,這個就和代碼塊中使用對象鎖同樣,由於synchronized修飾在對象方法上,因此它實質是等於代碼塊中使用this,由於一個類能夠有不少實例對象,因此這個是鎖不住的。
執行結果有問題,未能鎖住:
修飾靜態方法,這個就和代碼塊中使用類鎖同樣,由於synchronized修飾在靜態方法上,因此它實質是等於代碼塊中使用當前這個類的class,無論你一個類有多少個實例對象,你只有一個class,類鎖是惟一的就不會出現多線程同時執行方法的現象。
執行結果,和咱們預想的同樣20000:
總結一下:
一、synchronized修飾對象方法,若是是不一樣的對象調用這個方法,是不能啓動任何控制做用的。synchronized修飾代碼塊時,若是鎖資源使用的是this,那麼就和synchronized修飾對象方法同樣,由於一個類能夠有多個實例對象,每一個實例對象都不同,就至關於一個門,有多個鑰匙,誰均可以進入。因此咱們使用synchronized修飾代碼塊時,咱們須要聲明一個惟一的鑰匙,好比咱們上面的代碼,先建立一個靜態的實例對象,使用它看成這個門的惟一鑰匙,就能夠保證多個線程,不會同時進入方法內執行。
二、synchronized修飾靜態方法,就比較簡單了,咱們直接使用某一個類的class,它就能夠實現一個惟一性,無論是這個類的多少個實例對象,這些對象對應的class只有一個。因此是能夠實現多線程操做共享資源,不會有問題。那麼當咱們synchronized修飾代碼塊時,使用的是類鎖的話,那就很簡單了,惟一的類鎖,和修飾靜態方法同樣。
感謝諸君的觀看,文中若有紕漏,歡迎在評論區來交流。若是這篇文章幫助到了你,歡迎點贊👍關注。