偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Java死鎖,你學(xué)會了嗎?

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

死鎖

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

圖片圖片

死鎖的問題和其他的并發(fā)安全問題一樣,是概率性的,也就是說,即使存在發(fā)生死鎖的可能性,也并不是 100% 會發(fā)生的。如果每個鎖的持有時間很短,那么發(fā)生沖突的概率就很低,所以死鎖發(fā)生的概率也很低??赡苊刻煊袔浊f次的“獲取鎖”、“釋放鎖”操作,在巨量的次數(shù)面前,整個系統(tǒng)發(fā)生問題的幾率就會被放大。

必然死鎖例子

public static void main(String[] args) {
    //2個對象2把鎖
    //創(chuàng)建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();
}

運行結(jié)果:

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

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

死鎖必要條件

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

避免死鎖

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


責(zé)任編輯:武曉燕 來源: 沐雨花飛蝶
相關(guān)推薦

2022-10-13 08:02:13

死鎖運算系統(tǒng)

2024-02-04 00:00:00

Effect數(shù)據(jù)組件

2023-07-26 13:11:21

ChatGPT平臺工具

2023-01-10 08:43:15

定義DDD架構(gòu)

2023-08-01 12:51:18

WebGPT機器學(xué)習(xí)模型

2024-01-02 12:05:26

Java并發(fā)編程

2023-01-28 09:50:17

java多線程代碼

2024-01-18 09:38:00

Java注解JDK5

2023-10-10 11:04:11

Rust難點內(nèi)存

2024-05-06 00:00:00

InnoDBView隔離

2024-07-31 08:39:45

Git命令暫存區(qū)

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

設(shè)計模式Java

2022-06-16 07:50:35

數(shù)據(jù)結(jié)構(gòu)鏈表

2022-12-06 07:53:33

MySQL索引B+樹

2023-01-31 08:02:18

2023-10-06 14:49:21

SentinelHystrixtimeout
點贊
收藏

51CTO技術(shù)棧公眾號