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