1、死鎖
①什么是死鎖?
雙方因為互相等待對方的資源而進入了循環等待的過程
②產生死鎖的條件?
1、環路等待
2、持有并等待
3、互斥
4、不剝奪
必須滿足以上4個條件,才會產生死鎖
④示例代碼
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存在鎖互斥條件
環路等待及持有并等待:T1持有T1鎖,等待T2鎖;T2持有T2鎖,等待T1鎖。
操作系統的不剝奪~~
⑤死鎖的檢測工具
jconsole // 可直接檢測死鎖 jstack // 查看線程堆棧信息
⑥死鎖的解決方法
1、同樣的加鎖順序
2、加鎖限時,例如使用Lock
2、線程饑餓
①什么是線程饑餓?
線程饑餓是指線程得不到運行
②為什么會產生線程饑餓?
1、高優先級線程搶占低優先級線程的CPU時間片,導致低優先級線程無法執行
2、線程被永久阻塞在等待進入同步塊的狀態,其他線程總是能在該線程之前持續對該同步塊進行訪問
③解決方案
1、避免使用優先級
2、使用公平鎖
3、活鎖
活鎖不會阻塞線程,但是線程不能繼續執行。因為線程一直在執行重復的操作,但是總會丟失。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/76680.html
摘要:和方法用來設置線程是否成為守護線程和判斷線程是否是守護線程。守護線程依賴于創建它的線程,隨它的消亡而消亡。使用提供的方法,提醒線程終止,但是否真正終止由線程自己決定。參考實戰高并發程序設計多線程干貨系列一多線程基礎 一、如何創建多線程 1、繼承Thread類 public class MyThread extends Thread { @Override public ...
摘要:本文探討并發中的其它問題線程安全可見性活躍性等等。當閉鎖到達結束狀態時,門打開并允許所有線程通過。在從返回時被叫醒時,線程被放入鎖池,與其他線程競爭重新獲得鎖。 本文探討Java并發中的其它問題:線程安全、可見性、活躍性等等。 在行文之前,我想先推薦以下兩份資料,質量很高:極客學院-Java并發編程讀書筆記-《Java并發編程實戰》 線程安全 《Java并發編程實戰》中提到了太多的術語...
摘要:將與當前線程建立一對一關系的值移除。為了讓方法里的操作具有原子性,也就是在一個線程執行這一系列操作的同時禁止其他線程執行這些操作,提出了鎖的概念。 上頭一直在說以線程為基礎的并發編程的好處了,什么提高處理器利用率啦,簡化編程模型啦。但是磚家們還是認為并發編程是程序開發中最不可捉摸、最詭異、最扯犢子、最麻煩、最惡心、最心煩、最容易出錯、最不符合社會主義核心價值觀的一個部分~ 造成這么多最...
摘要:發布的對象內部狀態可能會破壞封裝性,使程序難以維持不變性條件。不變性線程安全性是不可變對象的固有屬性之一。可變對象必須通過安全方式來發布,并且必須是線程安全的或者有某個鎖保護起來。 線程的優缺點 線程是系統調度的基本單位。線程如果使用得當,可以有效地降低程序的開發和維護等成本,同時提升復雜應用程序的性能。多線程程序可以通過提高處理器資源的利用率來提升系統的吞吐率。與此同時,在線程的使用...
閱讀 2049·2023-04-25 15:11
閱讀 3496·2021-09-23 11:57
閱讀 1384·2021-07-26 23:38
閱讀 1326·2019-08-30 15:54
閱讀 645·2019-08-30 15:53
閱讀 3254·2019-08-26 13:36
閱讀 997·2019-08-26 12:01
閱讀 2871·2019-08-23 16:21