成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java死鎖,你學會了嗎?

開發 前端
死鎖是指兩個或兩個以上的進程在執行過程中,由于競爭資源或者由于彼此通信而造成的一種阻塞的現象,若無外力作用,他們都無法推進下去。通俗一點就是兩個進程都持有資源,但是又想搶對方的資源,互不相讓了。

死鎖

死鎖是指兩個或兩個以上的進程在執行過程中,由于競爭資源或者由于彼此通信而造成的一種阻塞的現象,若無外力作用,他們都無法推進下去。通俗一點就是兩個進程都持有資源,但是又想搶對方的資源,互不相讓了。

圖片圖片

死鎖的問題和其他的并發安全問題一樣,是概率性的,也就是說,即使存在發生死鎖的可能性,也并不是 100% 會發生的。如果每個鎖的持有時間很短,那么發生沖突的概率就很低,所以死鎖發生的概率也很低。可能每天有幾千萬次的“獲取鎖”、“釋放鎖”操作,在巨量的次數面前,整個系統發生問題的幾率就會被放大。

必然死鎖例子

public static void main(String[] args) {
    //2個對象2把鎖
    //創建2個線程,首先獲取自己的對象鎖,確保獲取了鎖,然后去獲取對方的鎖
    final Object o1 = new Object();
    final Object o2 = new Object();
    Thread thread1 = new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (o1) {
                System.out.println("thread1獲取了o1對象的鎖");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("thread1等待o2鎖釋放...");
                synchronized (o2) {
                    System.out.println("thread1獲取了o2對象的鎖");
                }
            }
        }
    });
    Thread thread2 = new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (o2) {
                System.out.println("thread2獲取了o2對象的鎖");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("thread2等待o1鎖釋放...");
                synchronized (o1) {
                    System.out.println("thread2獲取了o1對象的鎖");
                }
            }
        }
    });

    thread1.start();
    thread2.start();
}

運行結果:

thread1獲取了o1對象的鎖
thread2獲取了o2對象的鎖
thread2等待o1鎖釋放...
thread1等待o2鎖釋放...

可見線程一先上了o1鎖,線程二先上了o2鎖,然后線程一需要等待線程二的o2鎖釋放獲取到該鎖執行完后續代碼才能釋放o1鎖,但線程二也需要等待線程一的o1鎖釋放獲取到該鎖執行完后續代碼才能釋放o2鎖。他倆就互相等待,鎖死了。

死鎖必要條件

  • 互斥:一個資源每次只能被一個進程使用。
  • 請求與保持:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
  • 不剝奪:進程已獲得的資源,在末使用完之前,不能強行剝奪。
  • 循環等待:若干進程之間形成一種頭尾相接的循環等待資源關系。

避免死鎖

加鎖順序(線程按照一定的順序加鎖,規定獲取資源需要按照一定順序)
加鎖時限(線程嘗試獲取鎖的時候加上一定的時限,超過時限則放棄對該鎖的請求,并釋放自己占有的鎖;第二,可以用Lock中tryLock,嘗試拿鎖,拿不到不會持續等待)
死鎖檢測


責任編輯:武曉燕 來源: 沐雨花飛蝶
相關推薦

2022-10-13 08:02:13

死鎖運算系統

2024-02-04 00:00:00

Effect數據組件

2023-07-26 13:11:21

ChatGPT平臺工具

2023-01-10 08:43:15

定義DDD架構

2023-08-01 12:51:18

WebGPT機器學習模型

2024-01-02 12:05:26

Java并發編程

2023-01-28 09:50:17

java多線程代碼

2024-01-18 09:38:00

Java注解JDK5

2023-10-10 11:04:11

Rust難點內存

2024-05-06 00:00:00

InnoDBView隔離

2024-07-31 08:39:45

Git命令暫存區

2023-01-30 09:01:54

圖表指南圖形化

2022-07-08 09:27:48

CSSIFC模型

2023-12-12 08:02:10

2024-08-06 09:47:57

2024-03-06 08:28:16

設計模式Java

2022-06-16 07:50:35

數據結構鏈表

2022-12-06 07:53:33

MySQL索引B+樹

2023-01-31 08:02:18

2023-10-06 14:49:21

SentinelHystrixtimeout
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区四区五区在线视频 | 亚洲欧美激情精品一区二区 | 一级做a爰片性色毛片视频停止 | 亚洲伊人a | 日韩中文字幕视频 | 男女又爽又黄视频 | 一级欧美一级日韩片 | 夜夜草av| 韩国久久精品 | 男女羞羞视频在线看 | 欧美日韩福利视频 | 国产91精品久久久久久久网曝门 | 在线视频 亚洲 | 久久久久久久久久久久久久久久久久久久 | 日韩视频在线免费观看 | 一级亚洲| 欧美国产日韩在线观看 | 久久av综合 | 免费一区 | 成人午夜看片 | 国产一区二区不卡 | 欧美一区二区三区视频在线观看 | 欧美一区二区激情三区 | 欧美激情va永久在线播放 | 最新国产福利在线 | 久久久久久久亚洲精品 | 久久性 | 国产精品一区在线观看 | 亚洲大片在线观看 | 紧缚调教一区二区三区视频 | 欧美激情国产精品 | 国产精品视频一区二区三区不卡 | 久久99国产精品久久99果冻传媒 | 亚洲天堂免费 | 瑟瑟免费视频 | 国产精品小视频在线观看 | 久草在线青青草 | 午夜久久久 | 日韩三级在线观看 | 中文字幕一区二区三区在线观看 | 久久亚洲一区二区 |