前言
我們一般對共享數(shù)據(jù)操作的時候陪拘,為了達到線程安全我們會使用synchronized關(guān)鍵字去修飾方法或者代碼塊左刽。那么今天我們就來講一講synchronized關(guān)鍵字的使用。
專欄推薦:
并發(fā)編程專欄
synchronized的使用
synchronized的使用可以修飾代碼塊残黑,也可以修飾對象方法梨水,以及靜態(tài)方法茵臭。不過這些修飾的本質(zhì)實質(zhì)就只是鎖的資源不同旦委,一種是對象,一種是類摩钙。
修飾代碼塊
錯誤代碼:this查辩,對象鎖
當(dāng)我們使用不同實例對象去調(diào)用方法的時候會發(fā)現(xiàn)結(jié)果并不是我們想象的20000,因為this這個指代的是當(dāng)前對象功舀,因為是兩個不同的對象辟汰,所以使用this是鎖不住的阱佛。
看一下執(zhí)行結(jié)果:
只有使用相同的對象的時候瘫絮,才可以。所以不推薦使用this,而是使用固定的對象去作為鎖鹿鳖,才能夠鎖住翅帜。
相同實例對象的執(zhí)行結(jié)果:
下面我們使用一個初始化好的一個實例對象作為對象鎖涝滴。(useSynchronized)
使用不同的對象去調(diào)用也沒有問題歼疮,因為對象鎖是初始化好的一個實例對象useSynchronized作為對象鎖
執(zhí)行結(jié)果正確:
修飾對象方法
[圖片上傳中...(對象方法main.png-d41e8a-1628781214368-0)]
修飾對象方法,這個就和代碼塊中使用對象鎖一樣赡矢,因為synchronized修飾在對象方法上阅仔,所以它實質(zhì)是等于代碼塊中使用this,因為一個類可以有很多實例對象八酒,所以這個是鎖不住的。
執(zhí)行結(jié)果有問題袭景,未能鎖住:
修飾靜態(tài)方法
修飾靜態(tài)方法,這個就和代碼塊中使用類鎖一樣报辱,因為synchronized修飾在靜態(tài)方法上碍现,所以它實質(zhì)是等于代碼塊中使用當(dāng)前這個類的class,不管你一個類有多少個實例對象,你只有一個class爽篷,類鎖是唯一的就不會出現(xiàn)多線程同時執(zhí)行方法的現(xiàn)象慢睡。
執(zhí)行結(jié)果漂辐,和我們預(yù)想的一樣20000:
總結(jié)一下:
1髓涯、synchronized修飾對象方法,如果是不同的對象調(diào)用這個方法蚓再,是不能啟動任何控制作用的对途。synchronized修飾代碼塊時髓棋,如果鎖資源使用的是this,那么就和synchronized修飾對象方法一樣按声,因為一個類可以有多個實例對象,每個實例對象都不一樣须床,就相當(dāng)于一個門渐裂,有多個鑰匙钠惩,誰都可以進入篓跛。所以我們使用synchronized修飾代碼塊時坦刀,我們需要聲明一個唯一的鑰匙,比如我們上面的代碼沐寺,先創(chuàng)建一個靜態(tài)的實例對象混坞,使用它當(dāng)作這個門的唯一鑰匙钢坦,就可以保證多個線程场钉,不會同時進入方法內(nèi)執(zhí)行。
2泳猬、synchronized修飾靜態(tài)方法宇植,就比較簡單了,我們直接使用某一個類的class,它就可以實現(xiàn)一個唯一性指郁,不管是這個類的多少個實例對象忙上,這些對象對應(yīng)的class只有一個。所以是可以實現(xiàn)多線程操作共享資源闲坎,不會有問題疫粥。那么當(dāng)我們synchronized修飾代碼塊時,使用的是類鎖的話,那就很簡單了腰懂,唯一的類鎖梗逮,和修飾靜態(tài)方法一樣。
感謝諸君的觀看绣溜,文中如有紕漏慷彤,歡迎在評論區(qū)來交流。如果這篇文章幫助到了你底哗,歡迎點贊??關(guān)注岁诉。