應(yīng)用情況:多線程同時(shí)訪問,并且代碼塊不能被同時(shí)執(zhí)行的時(shí)候使用
使用synchronized用來修飾方法
基本執(zhí)行過程:當(dāng)多個(gè)線程同時(shí)訪問被synchronized修飾的方法的時(shí)候,有且只有一個(gè)線程可以訪問,當(dāng)一個(gè)線程在訪問的時(shí)候,其他線程只能等待。當(dāng)一個(gè)線程訪問完畢后下一個(gè)線程才可以訪問。
原理解析:當(dāng)方法被synchronized修飾后,如果想要執(zhí)行該方法就必須獲得相應(yīng)的鎖。
?鎖的說明:每個(gè)類又且僅有一個(gè)鎖(針對(duì)靜態(tài)方法),每個(gè)類的示例也是有且僅有一個(gè)鎖。
當(dāng)多個(gè)線程在同時(shí)訪問同一個(gè)方法的時(shí)候,執(zhí)行該方法就必須獲得相應(yīng)的鎖,同時(shí)鎖只有一個(gè),所以只能有一個(gè)線程可以獲得鎖,所以只有一個(gè)線程可以執(zhí)行,當(dāng)方法執(zhí)行完畢,線程會(huì)釋放鎖,其他線程獲取該鎖,執(zhí)行方法。
進(jìn)階說明:由于每個(gè)類只有一個(gè)鎖,所以當(dāng)一個(gè)類中又多個(gè)方法被synchronized修飾的時(shí)候,在同一時(shí)間內(nèi)只有一個(gè)方法可以獲得鎖,所以只有一個(gè)方法可以執(zhí)行。
原理說明進(jìn)行測(cè)試驗(yàn)證:(生物實(shí)驗(yàn)有個(gè)唯一變量原則,本次也采用這個(gè)原則)
驗(yàn)證多線程同時(shí)訪問被synchronized修飾的方法,方法順序執(zhí)行結(jié)果:
1.當(dāng)多線程調(diào)用方法的時(shí)候,方法沒有被synchronized修飾的時(shí)候的執(zhí)行結(jié)果
根據(jù)打印結(jié)果可以看出兩個(gè)線程調(diào)用的方法的時(shí)候,方法會(huì)被同時(shí)執(zhí)行。
當(dāng)我們僅僅為shwoDO()添加一個(gè)修飾關(guān)鍵字synchronized的時(shí)候,方法就會(huì)被順序調(diào)用。結(jié)果如下:
使用synchronized用來修飾代碼塊
? ? ?基本說明:當(dāng)synchronized在修飾代碼塊的時(shí)候需要一個(gè)自定義鎖,當(dāng)在多線程訪問,代碼塊的時(shí)候,只要獲得自定義鎖就可以執(zhí)行。
? ? ? 自定義鎖:可以是一個(gè)類,也可以是一個(gè)實(shí)例(可以是Objcet的子類,也可以是當(dāng)前類自己(this)),當(dāng)具有相同自定鎖的時(shí)候,代碼塊會(huì)順去執(zhí)行,當(dāng)鎖不同的時(shí)候互相不影響。
? ? 每個(gè)類又且僅有一個(gè)鎖(針對(duì)靜態(tài)方法),每個(gè)類的示例也是有且僅有一個(gè)鎖。
? ? ?基本書寫格式:synchronized(自定義鎖){同步執(zhí)行代碼塊}
測(cè)試將showDO()方法個(gè)能改為如圖,代碼塊內(nèi)部?jī)?nèi)容同樣會(huì)同步執(zhí)行。
總結(jié)說明:synchronized具有有兩種使用方法,第一種是修飾方法,第二種修飾代碼塊。
? ? ? ? ? ? ? ? ?無論那中方法,被修飾的內(nèi)容都會(huì)同步執(zhí)行。這也是synchronized的作用。
? ? ? ? ? ? ? ? ?關(guān)于兩種方法的使用:對(duì)于修飾方法常常會(huì)發(fā)生不必要的代碼塊被同步,同時(shí)鎖不可以選擇,但是使用 ? ? ? ? ? ? ? ? ? 簡(jiǎn)單。對(duì)于修飾代碼塊方法用起來更精確,需要自己制定鎖,用起來稍微麻煩一點(diǎn)。
若有錯(cuò)誤之初,請(qǐng)給予指示,謝謝~~~~~