Java線程活鎖的實(shí)現(xiàn)與死鎖等的區(qū)別
1、什么是活鎖
活鎖是指,線程沒(méi)有發(fā)生阻塞,但依然執(zhí)行不下去的情況。
2、活鎖的例子
如果兩個(gè)線程互相改變對(duì)方的結(jié)束條件,就可能導(dǎo)致雙方誰(shuí)也無(wú)法結(jié)束。
比如這個(gè)程序:
public class TestLiveLock { static volatile int count = 10; static final Object lock = new Object(); public static void main(String[] args) { new Thread(() -> { // 期望減到 0 退出循環(huán) while (count > 0) { sleep(0.2); count--; log.debug("count: {}", count); } }, "t1").start(); new Thread(() -> { // 期望超過(guò) 20 退出循環(huán) while (count < 20) { sleep(0.2); count++; log.debug("count: {}", count); } }, "t2").start(); } }
相當(dāng)于一個(gè)抽水一個(gè)注水,水池永遠(yuǎn)不會(huì)空或者滿
用生活舉例看Java多線程活躍性問(wèn)題【死鎖、饑餓、活鎖】
死鎖:吃飯問(wèn)題,5個(gè)人每人只有一雙筷子,只有讓另外一個(gè)人分享他自己的筷子給自己,自己才能吃到飯。若存在這樣的情況,若每個(gè)人都不把自己的筷子借給別人用餐,每個(gè)人都抓著自己手中的筷子不放,那么每個(gè)人都吃不上飯餓死了。也就是說(shuō)A線程擁有B線程所需的資源,B線程也有A線程所需資源,但兩者都不把資源分享出來(lái),最后需求達(dá)不到,最后餓死。
饑餓問(wèn)題:學(xué)校飯?zhí)门抨?duì)打飯,但有些人無(wú)秩序插隊(duì),那么插隊(duì)的人擁有了更高的優(yōu)先級(jí),更可能打到飯吃,也可能他買(mǎi)上了飯也不離開(kāi),導(dǎo)致后面的人無(wú)法打飯。最后那些守規(guī)矩的人(優(yōu)先級(jí)很低的人),就被餓死了。
引起饑餓問(wèn)題的一些因素:
- 高優(yōu)先級(jí)吞噬所有低優(yōu)先級(jí)的CPU時(shí)間片
- 線程被永久堵塞在一個(gè)等待進(jìn)入同步塊的狀態(tài)
- 等待的線程永遠(yuǎn)不被喚醒來(lái)
如果盡量避免饑餓問(wèn)題:
設(shè)置合理的優(yōu)先級(jí),使用鎖來(lái)代替synchronized
活鎖:到達(dá)終點(diǎn)有兩條路(記作1號(hào)路和2號(hào)路),有一對(duì)冤家A和B兩人同時(shí)走了1號(hào)路,在途中相遇,他們倆看見(jiàn)了對(duì)方,于是都轉(zhuǎn)身離開(kāi),A走了2號(hào)路,B也走了2號(hào)路,在行走的過(guò)程中,兩人又再見(jiàn)碰面,于是又轉(zhuǎn)身離開(kāi)。后來(lái)A、B兩人又同時(shí)走了1號(hào)路又再次碰面,就這樣反反復(fù)復(fù)...這就是活鎖問(wèn)題
到此這篇關(guān)于Java線程活鎖的實(shí)現(xiàn)與死鎖等的區(qū)別的文章就介紹到這了,更多相關(guān)Java線程活鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
導(dǎo)入項(xiàng)目出現(xiàn)Java多個(gè)工程相互引用異常A cycle was detected in the build path o
今天小編就為大家分享一篇關(guān)于導(dǎo)入項(xiàng)目出現(xiàn)Java多個(gè)工程相互引用異常A cycle was detected in the build path of project的解決辦法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12Java中JUC包(java.util.concurrent)下的常用子類
相信大家已經(jīng)對(duì)并發(fā)機(jī)制中出現(xiàn)的很多的常見(jiàn)知識(shí)點(diǎn)進(jìn)行了總結(jié),下面這篇文章主要給大家介紹了關(guān)于Java中JUC包(java.util.concurrent)下的常用子類的相關(guān)資料,文中通過(guò)圖文以及示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12spring boot 加載web容器tomcat流程源碼分析
本文章主要描述spring boot加載web容器 tomcat的部分,為了避免文章知識(shí)點(diǎn)過(guò)于分散,其他相關(guān)的如bean的加載,tomcat內(nèi)部流程等不做深入討論,具體內(nèi)容詳情跟隨小編一起看看吧2021-06-06Spring Boot+Nginx實(shí)現(xiàn)大文件下載功能
相信很多小伙伴,在日常開(kāi)放中都會(huì)遇到大文件下載的情況,大文件下載方式也有很多,比如非常流行的分片下載、斷點(diǎn)下載;當(dāng)然也可以結(jié)合Nginx來(lái)實(shí)現(xiàn)大文件下載,在中小項(xiàng)目非常適合使用,這篇文章主要介紹了Spring Boot結(jié)合Nginx實(shí)現(xiàn)大文件下載,需要的朋友可以參考下2024-05-05java實(shí)現(xiàn)簡(jiǎn)單登錄界面的實(shí)戰(zhàn)過(guò)程
學(xué)習(xí)JAVA的過(guò)程當(dāng)中,登陸界面是多數(shù)人第一個(gè)實(shí)現(xiàn)的小程序,下面這篇文章主要給大家介紹了關(guān)于利用java實(shí)現(xiàn)簡(jiǎn)單登錄界面的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05使用MultipartFile實(shí)現(xiàn)文件上傳功能
這篇文章主要介紹了使用MultipartFile實(shí)現(xiàn)文件上傳功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06