1.synchronized
當(dāng)多個(gè)線(xiàn)程訪(fǎng)問(wèn)run方法嫩挤,以排隊(duì)的方式進(jìn)行(這里的排隊(duì)是按照cpu分配的順序)
一個(gè)線(xiàn)程想要執(zhí)行synchronize修飾的方法里面的代碼:
????1.嘗試獲得鎖
????2.如果拿到鎖,執(zhí)行同步區(qū)內(nèi)的代碼元旬,否則一直嘗試去拿鎖
2.多個(gè)線(xiàn)程多個(gè)鎖
非靜態(tài)方法一個(gè)對(duì)象一把鎖
靜態(tài)方法前面的synchronized鎖的是Class而不是對(duì)象
synchronized取得的鎖都是對(duì)象鎖。而不是把一段代碼當(dāng)做鎖。
有一種情況則是相同的鎖匀归,即在靜態(tài)方法上面加syn關(guān)鍵字坑资,表示鎖定的是class類(lèi)
3.對(duì)象鎖的同步和異步
同步的概念就是共享,如果不是共享的資源就沒(méi)必要同步
同步的目的為了線(xiàn)程安全:
? ? ? ? 原子性
? ? ? ? 可見(jiàn)性
兩個(gè)線(xiàn)程穆端,一個(gè)調(diào)用對(duì)象的同步方法袱贮,一個(gè)調(diào)用對(duì)象的非同步方法
* t1線(xiàn)程先持有object對(duì)象的lock鎖,t2線(xiàn)程可以以異步的方式調(diào)用對(duì)象的非同步方法
* t1線(xiàn)程先持有object對(duì)象的lock鎖体啰,t2線(xiàn)程如果要調(diào)用對(duì)象的同步方法則需要等待
4.鎖重入
(1)同一個(gè)對(duì)象多個(gè)同步方法互相調(diào)用
一個(gè)線(xiàn)程獲得對(duì)象鎖之后攒巍,可以繼續(xù)獲得該對(duì)象其他同步方法的同步鎖
(2)父子類(lèi)同步方法調(diào)用
子類(lèi)可以獲取父類(lèi)的同步鎖
5.線(xiàn)程執(zhí)行異常
為了避免線(xiàn)程繼續(xù)執(zhí)行導(dǎo)致的各種不一致問(wèn)題,需要及時(shí)退出線(xiàn)程
throw RuntimeException();
6.常量鎖
(1).最好不要用常量鎖荒勇,因?yàn)闀?huì)導(dǎo)致死鎖窑业,常量在棧中是同一把鎖
(2)字符串類(lèi)鎖,最好不要修改鎖的值枕屉,否則會(huì)出現(xiàn)鎖修改導(dǎo)致不同步
(3)對(duì)象鎖常柄,修改對(duì)象中的某個(gè)屬性的值,不會(huì)引發(fā)對(duì)象鎖更改