Synchronized的基本使用
原文鏈接:https://www.cnblogs.com/paddix/p/5367116.html
Synchronized是Java中解決并發(fā)問題的一種最常用的方法,也是最簡(jiǎn)單的一種方法。Synchronized的作用主要有三個(gè):(1)確保線程互斥的訪問同步代碼(2)保證共享變量的修改能夠及時(shí)可見(3)有效解決重排序問題。從語法上講,Synchronized總共有三種用法:
(1)修飾普通方法
(2)修飾靜態(tài)方法
(3)修飾代碼塊
接下來我就通過幾個(gè)例子程序來說明一下這三種使用方式(為了便于比較,三段代碼除了Synchronized的使用方式不同以外,其他基本保持一致)。
運(yùn)行結(jié)果分析
1、代碼段2結(jié)果:
雖然method1和method2是不同的方法,但是這兩個(gè)方法都進(jìn)行了同步,并且是通過同一個(gè)對(duì)象去調(diào)用的,所以調(diào)用之前都需要先去競(jìng)爭(zhēng)同一個(gè)對(duì)象上的鎖(monitor),也就只能互斥的獲取到鎖,因此,method1和method2只能順序的執(zhí)行。
2、代碼段3結(jié)果:
雖然test和test2屬于不同對(duì)象,但是test和test2屬于同一個(gè)類的不同實(shí)例,由于method1和method2都屬于靜態(tài)同步方法,所以調(diào)用的時(shí)候需要獲取同一個(gè)類上monitor(每個(gè)類只對(duì)應(yīng)一個(gè)class對(duì)象),所以也只能順序的執(zhí)行。
3、代碼段4結(jié)果:
對(duì)于代碼塊的同步實(shí)質(zhì)上需要獲取Synchronized關(guān)鍵字后面括號(hào)中對(duì)象的monitor,由于這段代碼中括號(hào)的內(nèi)容都是this,而method1和method2又是通過同一的對(duì)象去調(diào)用的,所以進(jìn)入同步塊之前需要去競(jìng)爭(zhēng)同一個(gè)對(duì)象上的鎖,因此只能順序執(zhí)行同步塊。