Java線程活鎖的實(shí)現(xiàn)與死鎖等的區(qū)別
1、什么是活鎖
活鎖是指,線程沒有發(fā)生阻塞,但依然執(zhí)行不下去的情況。
2、活鎖的例子
如果兩個線程互相改變對方的結(jié)束條件,就可能導(dǎo)致雙方誰也無法結(jié)束。
比如這個程序:
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();
}
}相當(dāng)于一個抽水一個注水,水池永遠(yuǎn)不會空或者滿
用生活舉例看Java多線程活躍性問題【死鎖、饑餓、活鎖】
死鎖:吃飯問題,5個人每人只有一雙筷子,只有讓另外一個人分享他自己的筷子給自己,自己才能吃到飯。若存在這樣的情況,若每個人都不把自己的筷子借給別人用餐,每個人都抓著自己手中的筷子不放,那么每個人都吃不上飯餓死了。也就是說A線程擁有B線程所需的資源,B線程也有A線程所需資源,但兩者都不把資源分享出來,最后需求達(dá)不到,最后餓死。
饑餓問題:學(xué)校飯?zhí)门抨?duì)打飯,但有些人無秩序插隊(duì),那么插隊(duì)的人擁有了更高的優(yōu)先級,更可能打到飯吃,也可能他買上了飯也不離開,導(dǎo)致后面的人無法打飯。最后那些守規(guī)矩的人(優(yōu)先級很低的人),就被餓死了。
引起饑餓問題的一些因素:
- 高優(yōu)先級吞噬所有低優(yōu)先級的CPU時間片
- 線程被永久堵塞在一個等待進(jìn)入同步塊的狀態(tài)
- 等待的線程永遠(yuǎn)不被喚醒來
如果盡量避免饑餓問題:
設(shè)置合理的優(yōu)先級,使用鎖來代替synchronized
活鎖:到達(dá)終點(diǎn)有兩條路(記作1號路和2號路),有一對冤家A和B兩人同時走了1號路,在途中相遇,他們倆看見了對方,于是都轉(zhuǎn)身離開,A走了2號路,B也走了2號路,在行走的過程中,兩人又再見碰面,于是又轉(zhuǎn)身離開。后來A、B兩人又同時走了1號路又再次碰面,就這樣反反復(fù)復(fù)...這就是活鎖問題
到此這篇關(guān)于Java線程活鎖的實(shí)現(xiàn)與死鎖等的區(qū)別的文章就介紹到這了,更多相關(guān)Java線程活鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java設(shè)計(jì)模式之模板模式(Template模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之模板模式(Template模式)介紹,定義一個操作中算法的骨架,將一些步驟的執(zhí)行延遲到其子類中,需要的朋友可以參考下2015-03-03
Java使用wait/notify實(shí)現(xiàn)線程間通信上篇
wait()和notify()是直接隸屬于Object類,也就是說所有對象都擁有這一對方法,下面這篇文章主要給大家介紹了關(guān)于使用wait/notify實(shí)現(xiàn)線程間通信的相關(guān)資料,需要的朋友可以參考下2022-12-12
Java?SpringBoot整合shiro-spring-boot-starterqi項(xiàng)目報(bào)錯解決
這篇文章主要介紹了Java?SpringBoot整合shiro-spring-boot-starterqi項(xiàng)目報(bào)錯解決,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考一下2022-08-08
Open-Feign整合hystrix降級熔斷實(shí)戰(zhàn)記錄
這篇文章主要介紹了Open-Feign整合hystrix降級熔斷實(shí)戰(zhàn)記錄,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09

