成人免费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,嘗試拿鎖,拿不到不會持續等待)
死鎖檢測


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

2024-02-04 00:00:00

Effect數據組件

2023-07-26 13:11:21

ChatGPT平臺工具

2023-01-10 08:43:15

定義DDD架構

2023-01-28 09:50:17

java多線程代碼

2024-01-18 09:38:00

Java注解JDK5

2022-10-13 08:02:13

死鎖運算系統

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

2022-09-26 08:49:11

Java架構CPU

2024-01-02 12:05:26

Java并發編程

2023-08-01 12:51:18

WebGPT機器學習模型

2022-03-08 08:39:22

gRPC協議云原生

2024-11-28 10:09:06

2023-03-30 08:26:31

DNSTCPUDP

2023-06-26 00:01:11

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区三区四区五区午夜 | 黄色免费在线观看网址 | 国产成人在线视频免费观看 | 欧美亚洲另类丝袜综合网动图 | 精品久久久久一区二区国产 | 成人性生交大片 | av在线视| 国产高清av免费观看 | 精品区一区二区 | av手机在线播放 | 4h影视| 精品亚洲一区二区三区四区五区高 | 国产成人精品一区二 | 成人免费视屏 | 欧美性猛交一区二区三区精品 | 日本高清不卡视频 | 国产精品久久久久久福利一牛影视 | 久久这里有精品 | 99婷婷| xxx.在线观看 | 日韩免费高清视频 | 91精品国产日韩91久久久久久 | 欧美精品日韩 | 91视视频在线观看入口直接观看 | 日本视频中文字幕 | 天天综合成人网 | 国产精品免费播放 | 亚洲欧洲日韩精品 中文字幕 | 国产精品天堂 | 国产不卡一 | 亚洲国产网 | 精品日韩一区 | 成人三级av| 一二三区av | 久在线| 特一级毛片 | 国产黄色av电影 | 午夜精品在线观看 | 最新免费视频 | 日韩精品一区二区三区中文字幕 | 中文字幕第一页在线 |