真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

什么是線程死鎖

本篇內(nèi)容介紹了“什么是線程死鎖”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

目前創(chuàng)新互聯(lián)已為成百上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、黔江網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

死鎖定義
死鎖產(chǎn)生的條件
死鎖示例
如何避免死鎖

1. 死鎖定義

● 死鎖是指兩個(gè)或兩個(gè)以上的線程在執(zhí)行過程中,因爭奪資源而造成互相等待的現(xiàn)象,
在無外力作用的情況下,這些線程會一直相互等待而無法繼續(xù)運(yùn)行下去

2. 死鎖產(chǎn)生的條件

● 互斥條件:指線程對已經(jīng)獲取到的資源進(jìn)行排它性使用,即該資源同時(shí)只由一個(gè)線程占用。
如果此時(shí)還有其他線程請求獲取該資源,則請求者只能等待,直至占有資源的線程釋放該資源。
● 請求并持有條件:指一個(gè)線程已經(jīng)持有了至少一個(gè)資源,但又提出了新的資源請求,而新資源已被其他線程占有,
所以當(dāng)前線程會被阻塞,但阻塞的同時(shí)并不釋放自己已經(jīng)獲取的資源。
● 不可剝奪條件:指線程獲取到的資源在自己使用完之前不能被其他線程搶占,只有在自己使用完畢后才由自己釋放該資源。
● 環(huán)路等待條件:指在發(fā)生死鎖時(shí),必然存在一個(gè)線程—資源的環(huán)形鏈,即線程集合{T0, T1, T2, …, Tn}中的T0正在
等待一個(gè)T1占用的資源,T1正在等待T2占用的資源,……Tn正在等待已被T0占用的資源。

3. 死鎖示例

package com.pimee.thread.deadlock;
/**
 * 線程死鎖示例
 */
public class DeadLock {
    private static Object resourceA = new Object();
    private static Object resourceB = new Object();
    public static void main(String[] args) {
        Thread threadA = new Thread(new Runnable() {
            [@Override](https://my.oschina.net/u/1162528)
            public void run() {
                synchronized (resourceA){
                    System.out.println(Thread.currentThread().getName() + "get resourceA");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + " is waiting for resourceB");
                    synchronized (resourceB){
                        System.out.println(Thread.currentThread().getName() + " get resourceB");
                    }
                }
            }
        });
        Thread threadB = new Thread(new Runnable() {
            [@Override](https://my.oschina.net/u/1162528)
            public void run() {
                synchronized (resourceB){
                    System.out.println(Thread.currentThread().getName() + " get resourceB");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + " is waiting for resourceA");
                    synchronized (resourceA){
                        System.out.println(Thread.currentThread().getName() + " get resourceA");
                    }
                }
            }
        });
        threadA.start();
        threadB.start();
    }
}

什么是線程死鎖

4. 死鎖的避免

● 加鎖順序:線程按照相同的順序加鎖。
● 加鎖時(shí)限,線程獲取鎖的過程中限制一定的時(shí)間,如果給定時(shí)間內(nèi)獲取不到,就算了,別勉強(qiáng)自己。這需要用到Lock的一些API

上面死鎖的demo,修改一下加鎖的書序,可以解決問題

package com.pimee.thread.deadlock;
/**
 * 線程死鎖示例
 */
public class DeadLock {
    private static Object resourceA = new Object();
    private static Object resourceB = new Object();
    public static void main(String[] args) {
        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (resourceA){
                    System.out.println(Thread.currentThread().getName() + " get resourceA");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + " is waiting for resourceB");
                    synchronized (resourceB){
                        System.out.println(Thread.currentThread().getName() + " get resourceB");
                    }
                }
            }
        });
        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (resourceA){
                    System.out.println(Thread.currentThread().getName() + " get resourceA");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + " is waiting for resourceA");
                    synchronized (resourceB){
                        System.out.println(Thread.currentThread().getName() + " get resourceB");
                    }
                }
            }
        });
        threadA.start();
        threadB.start();
    }
}

什么是線程死鎖

可以使用jstatck查看jvm日志,你會發(fā)現(xiàn)以下結(jié)果: 什么是線程死鎖

“什么是線程死鎖”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


當(dāng)前名稱:什么是線程死鎖
標(biāo)題來源:http://weahome.cn/article/pcsodg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部