1、死鎖
①什么是死鎖?
雙方因?yàn)榛ハ嗟却龑?duì)方的資源而進(jìn)入了循環(huán)等待的過程
②產(chǎn)生死鎖的條件?
1、環(huán)路等待
2、持有并等待
3、互斥
4、不剝奪
必須滿足以上4個(gè)條件,才會(huì)產(chǎn)生死鎖
④示例代碼
public static void main(String[] args) { new T1().start(); new T2().start(); } static class T1 extends Thread { @Override public void run() { a(); } public void a() { while (true) { synchronized (T1.class) { synchronized (T2.class) { System.out.println("a"); } } } } } static class T2 extends Thread { @Override public void run() { b(); } public void b() { while (true) { synchronized (T2.class) { synchronized (T1.class) { System.out.println("b"); } } } } }
解釋:
互斥:T1和T2存在鎖互斥條件
環(huán)路等待及持有并等待:T1持有T1鎖,等待T2鎖;T2持有T2鎖,等待T1鎖。
操作系統(tǒng)的不剝奪~~
⑤死鎖的檢測(cè)工具
jconsole // 可直接檢測(cè)死鎖 jstack // 查看線程堆棧信息
⑥死鎖的解決方法
1、同樣的加鎖順序
2、加鎖限時(shí),例如使用Lock
2、線程饑餓
①什么是線程饑餓?
線程饑餓是指線程得不到運(yùn)行
②為什么會(huì)產(chǎn)生線程饑餓?
1、高優(yōu)先級(jí)線程搶占低優(yōu)先級(jí)線程的CPU時(shí)間片,導(dǎo)致低優(yōu)先級(jí)線程無法執(zhí)行
2、線程被永久阻塞在等待進(jìn)入同步塊的狀態(tài),其他線程總是能在該線程之前持續(xù)對(duì)該同步塊進(jìn)行訪問
③解決方案
1、避免使用優(yōu)先級(jí)
2、使用公平鎖
3、活鎖
活鎖不會(huì)阻塞線程,但是線程不能繼續(xù)執(zhí)行。因?yàn)榫€程一直在執(zhí)行重復(fù)的操作,但是總會(huì)丟失。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76680.html
摘要:和方法用來設(shè)置線程是否成為守護(hù)線程和判斷線程是否是守護(hù)線程。守護(hù)線程依賴于創(chuàng)建它的線程,隨它的消亡而消亡。使用提供的方法,提醒線程終止,但是否真正終止由線程自己決定。參考實(shí)戰(zhàn)高并發(fā)程序設(shè)計(jì)多線程干貨系列一多線程基礎(chǔ) 一、如何創(chuàng)建多線程 1、繼承Thread類 public class MyThread extends Thread { @Override public ...
摘要:本文探討并發(fā)中的其它問題線程安全可見性活躍性等等。當(dāng)閉鎖到達(dá)結(jié)束狀態(tài)時(shí),門打開并允許所有線程通過。在從返回時(shí)被叫醒時(shí),線程被放入鎖池,與其他線程競(jìng)爭(zhēng)重新獲得鎖。 本文探討Java并發(fā)中的其它問題:線程安全、可見性、活躍性等等。 在行文之前,我想先推薦以下兩份資料,質(zhì)量很高:極客學(xué)院-Java并發(fā)編程讀書筆記-《Java并發(fā)編程實(shí)戰(zhàn)》 線程安全 《Java并發(fā)編程實(shí)戰(zhàn)》中提到了太多的術(shù)語...
摘要:將與當(dāng)前線程建立一對(duì)一關(guān)系的值移除。為了讓方法里的操作具有原子性,也就是在一個(gè)線程執(zhí)行這一系列操作的同時(shí)禁止其他線程執(zhí)行這些操作,提出了鎖的概念。 上頭一直在說以線程為基礎(chǔ)的并發(fā)編程的好處了,什么提高處理器利用率啦,簡(jiǎn)化編程模型啦。但是磚家們還是認(rèn)為并發(fā)編程是程序開發(fā)中最不可捉摸、最詭異、最扯犢子、最麻煩、最惡心、最心煩、最容易出錯(cuò)、最不符合社會(huì)主義核心價(jià)值觀的一個(gè)部分~ 造成這么多最...
摘要:原文出處設(shè)計(jì)的一個(gè)重要目標(biāo)是設(shè)置階段的持續(xù)時(shí)長(zhǎng)和頻率,因?yàn)槔占骺深A(yù)測(cè),可配置。收集器盡自己最大努力高概率實(shí)現(xiàn)目標(biāo)但不是必然,它會(huì)是硬實(shí)時(shí)。因此名稱是收集器。運(yùn)行不同使用獨(dú)立的收集器。 原文出處:G1 – Garbage First G1設(shè)計(jì)的一個(gè)重要目標(biāo)是設(shè)置stop-the-world階段的持續(xù)時(shí)長(zhǎng)和頻率,因?yàn)槔占骺深A(yù)測(cè),可配置。事實(shí)上,G1是一款軟實(shí)時(shí)的收集器,意味著你...
摘要:發(fā)布的對(duì)象內(nèi)部狀態(tài)可能會(huì)破壞封裝性,使程序難以維持不變性條件。不變性線程安全性是不可變對(duì)象的固有屬性之一??勺儗?duì)象必須通過安全方式來發(fā)布,并且必須是線程安全的或者有某個(gè)鎖保護(hù)起來。 線程的優(yōu)缺點(diǎn) 線程是系統(tǒng)調(diào)度的基本單位。線程如果使用得當(dāng),可以有效地降低程序的開發(fā)和維護(hù)等成本,同時(shí)提升復(fù)雜應(yīng)用程序的性能。多線程程序可以通過提高處理器資源的利用率來提升系統(tǒng)的吞吐率。與此同時(shí),在線程的使用...
閱讀 2052·2023-04-25 15:11
閱讀 3517·2021-09-23 11:57
閱讀 1388·2021-07-26 23:38
閱讀 1328·2019-08-30 15:54
閱讀 646·2019-08-30 15:53
閱讀 3257·2019-08-26 13:36
閱讀 998·2019-08-26 12:01
閱讀 2873·2019-08-23 16:21