更新時間:2020-08-20 12:18:44 來源:動力節(jié)點(diǎn) 瀏覽1439次
Java多線程鎖是什么?這個問題就由動力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編來為大家解答。
Java中的鎖有以下幾種:
一、可重入鎖:
1. 當(dāng)一個線程再次獲取它自己已經(jīng)獲取的鎖時,如果不被阻塞,則說明該鎖是可重入鎖,也就是只要該線程獲取了該鎖,那么可以無限次數(shù)地進(jìn)入被該鎖鎖住的代碼里。相反,如果被阻塞了,說明是不可重入鎖。
2. synchronized內(nèi)部鎖是可重入鎖。可重入鎖的原理:在鎖內(nèi)部維護(hù)一個線程標(biāo)示,用來標(biāo)示該鎖目前被哪個線程占用。
當(dāng)一個線程獲取了該鎖時。計數(shù)器的值會變成1,這時其他線程再來獲取該鎖時會發(fā)現(xiàn)鎖的所有者不是自己而被阻塞掛起。但是當(dāng)獲取了該鎖的線程再次獲取鎖時發(fā)現(xiàn)鎖擁有者是自己,就會把計數(shù)器值加+1,當(dāng)釋放鎖后計數(shù)器值-1。當(dāng)計數(shù)器的值為0時,鎖里面的線程標(biāo)示被重置為null,這時被阻塞的線程會被喚醒來競爭獲取該鎖。
二、死鎖
死鎖:當(dāng)一個線程永遠(yuǎn)的持有一把鎖,并且其他線程都嘗試來獲得這把鎖時,就會發(fā)生死鎖。
多個線程互相擁有鎖,互不釋放鎖,造成線程死鎖。
可以通過cmd命令窗口中輸入jconsole命令來檢測線程情況,查看死鎖。
三、自旋鎖
自旋鎖:當(dāng)前線程在獲取鎖時,如果發(fā)現(xiàn)鎖已經(jīng)被其他線程占有,它不會馬上阻塞自己,在不放棄CPU使用權(quán)的情況下,多次嘗試獲取(默認(rèn)次數(shù)是10,可以通過使用-XX:PreBlockSpinsh參數(shù)設(shè)置該值),很有可能在后面的幾次嘗試中其他線程已經(jīng)釋放了鎖。而如果嘗試指定的次數(shù)后仍沒有獲取到鎖,則當(dāng)前線程才會被阻塞掛起。
自旋鎖是使用CPU時間換取線程阻塞與調(diào)度的開銷,但是很有可能這些CPU時間白白浪費(fèi)了。
四、Lock鎖
1. Lock鎖需要顯示地獲取lock()和釋放鎖unlock(),繁瑣,但是代碼編寫靈活。
Synchronized不需要顯示地獲取和釋放鎖,簡單。
2. 使用Lock可以方便的實(shí)現(xiàn)公平性;
3. Lock可以非阻塞的獲取鎖,能被中斷的獲取鎖,也能超時獲取鎖;
五、獨(dú)占鎖和共享鎖
1. 根據(jù)鎖只能被單個線程持有還是能被多個線程共同持有,鎖可以分為獨(dú)占鎖和共享鎖。
獨(dú)占鎖:它保證任何時候都只有一個線程能得到鎖,ReetrantLock就是以獨(dú)占方式實(shí)現(xiàn)的。
共享鎖:它可以同時由多個線程持有,如ReadWriteLock讀寫鎖,它允許一個資源可以被多個線程同時進(jìn)行操作。
2. 獨(dú)占鎖是一種悲觀鎖,由于每次訪問資源都先加上互斥鎖,這就限制了并發(fā)性,因?yàn)樽x操作并不會影響數(shù)據(jù)的一致性,不存在線程安全問題,而獨(dú)占鎖只允許在同一時間由一個線程讀取數(shù)據(jù),其他線程必須等待當(dāng)前線程釋放鎖才能進(jìn)行讀取。
3. 共享鎖是一種樂觀鎖,它放寬了加鎖的條件,允許多個線程同時進(jìn)行讀操作。
通過上述相信大家對Java多線程鎖已經(jīng)有所了解,如果想了解更多相關(guān)信息,可以到動力節(jié)點(diǎn)官網(wǎng)中的技術(shù)文檔中進(jìn)行在線學(xué)習(xí)。
初級 202925
初級 203221
初級 202629
初級 203743