關(guān)于如何解決java線程安全問(wèn)題?很重要? 快拿小本本記下來(lái)!

線程安全問(wèn)題

什么是線程安全問(wèn)題?

多個(gè)線程操作同一個(gè)共享資源的時(shí)候可能會(huì)出現(xiàn)線程安全問(wèn)題。

如何解決線程安全問(wèn)題?

使用線程同步

線程同步

什么是線程同步?

線程同步是多個(gè)線程同時(shí)訪問(wèn)同一個(gè)資源。


線程同步的作用:

就是為了解決線程安全問(wèn)題的方案

如何實(shí)現(xiàn)線程同步?

把共享資源進(jìn)行上鎖,每次只能一個(gè)線程進(jìn)入訪問(wèn)完畢后,其他線程才能繼續(xù)訪問(wèn)。


線程同步的方式有三種:

1.同步代碼塊

2.同步方法

3.lock顯示鎖 同步代碼塊


同步代碼塊

作用:把出現(xiàn)線程安全問(wèn)題的核心代碼給上鎖,每次只能一個(gè)線程進(jìn)入,執(zhí)行完畢以后自動(dòng)上鎖,其他線程才可以進(jìn)來(lái)執(zhí)行。

格式:

synchronized(鎖對(duì)象){
    //訪問(wèn)共享資源的核心代碼
}

鎖對(duì)象建議使用共享資源

在實(shí)例方法中建議使用this作為鎖對(duì)象。此時(shí)this正好是共享資源!

在靜態(tài)方法中建議使用類名.class字節(jié)碼作為鎖對(duì)象。

synchronized (this){
    if(this.money >= money){
        System.out.println(name+"來(lái)取錢(qián),吐出:"+money);
        this.money -= money;
        System.out.println(name+"來(lái)取錢(qián)"+money+"成功,取錢(qián)后剩余:"+this.money;
    }else{
        System.out.println(name+"來(lái)取錢(qián),余額不足,剩余"+this.money;
    }
}

//張三來(lái)取錢(qián),吐出:10000
//張三取錢(qián)成功,取錢(qián)后剩余0
//李四來(lái)取錢(qián),余額不足,剩余0

同步方法

作用:

把出現(xiàn)線程安全問(wèn)題的核心方法給鎖起來(lái)

每次只能使一個(gè)線程進(jìn)入訪問(wèn),其他線程必須在方法外面等待。

用法:

直接給方法加上一個(gè)修飾符 synchronized

public synchronized void ThreadDemo(){
    if(this.money >= money){
        System.out.println(name+"來(lái)取錢(qián),吐出:"+money);
        this.money -= money;
        System.out.println(name+"來(lái)取錢(qián)"+money+"成功,取錢(qián)后剩余:"+this.money;
    }else{
        System.out.println(name+"來(lái)取錢(qián),余額不足,剩余"+this.money;
    }
}

lock顯示鎖

java.util.concurrent.locks.Lock機(jī)制提供了比synchronized代碼塊和synchronized方法更廣泛的鎖操作,同步代碼塊/同步方法具有的功能Lock鎖都有,除此之外更強(qiáng)大更方便

Lcok鎖也稱同步鎖,加鎖與釋放鎖方法化了,如下:

--public void lock()   //:加同步鎖
--public void unlock() //:釋放同步鎖

實(shí)例:

//創(chuàng)建一把鎖
private final Lock lock = new ReentrantLock();

lock.lock();        //上鎖
try{
    if(this.money >= money){
        System.out.println(name+"來(lái)取錢(qián),吐出:"+money);
        this.money -= money;
        System.out.println(name+"來(lái)取錢(qián)"+money+"成功,取錢(qián)后剩余:"+this.money;
    }else{
        System.out.println(name+"來(lái)取錢(qián),余額不足,剩余"+this.money;
    }catch (Exception e){
        e.printStackTrace();
    }finally{
    lock.unlock();      //解鎖
    }
}

分類: [Java基礎(chǔ)]


在這里插入圖片描述
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 為什么有線程安全問(wèn)題? 當(dāng)多個(gè)線程同時(shí)共享,同一個(gè)全局變量或靜態(tài)變量,做寫(xiě)的操作時(shí),可能會(huì)發(fā)生數(shù)據(jù)沖突問(wèn)題,也就是...
    請(qǐng)收下章魚(yú)君的膝蓋閱讀 1,131評(píng)論 0 0
  • title: 線程安全問(wèn)題date: 2019/04/01 17:13 線程安全問(wèn)題是由于多個(gè)線程同時(shí)操作同一全局...
    想54256閱讀 993評(píng)論 0 0
  • 線程安全問(wèn)題 本篇主要講解 線程安全問(wèn)題,演示什么情況下會(huì)出現(xiàn)線程安全問(wèn)題,以及介紹了 Java內(nèi)存模型 、vol...
    Aska小強(qiáng)閱讀 161評(píng)論 0 0
  • 線程安全問(wèn)題 兩個(gè)窗口同時(shí)打印一張票的問(wèn)題: 線程售票窗口1:搶到cpu資源開(kāi)始執(zhí)行run方法,拿到的票是44號(hào)...
    Hanks_Wei閱讀 221評(píng)論 0 0
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者,不喜歡去冒險(xiǎn),但是人生放棄了冒險(xiǎn),也就放棄了無(wú)數(shù)的可能。 ...
    yichen大刀閱讀 7,787評(píng)論 0 4

友情鏈接更多精彩內(nèi)容