多執行緒併發同步問題及解決方案

hqh1357054948發表於2019-07-20

執行緒併發同步

執行緒同步其核心就在一個同步,即協同、配合,也就是按照預定順序先後的執行,也就是你做我等,你做完並返回,然後我開始執行。
執行緒同步就是當執行緒發出一個功能呼叫時,在沒得到結果前不會返回,且其他執行緒不能呼叫該方法。
在多執行緒裡面有些敏感資料不允許被多個執行緒同時訪問,使用執行緒同步就是要保證在一個時間內只有一個執行緒訪問一個資料,以此來保證資料的正確性。

執行緒同步中可能存在的安全隱患解決方法

1、同步程式碼塊

使用synchronized()對需要完整執行不許中斷的程式碼塊進行“包裹”,synchronized(object,obj)構造方法可以傳入任何類的物件,
但是既然是監聽器,就傳一個保證唯一的物件來“鎖”的唯一性,因此一般使用共享資源來作為object傳入synchronized()。

synchronized(this) {
            // 先判斷賬戶現在的餘額是否夠取錢金額
            if(count-money < 0){  
                System.out.println("賬戶餘額不足!"); 
                return;  
            } 
            // 取錢
            count -= money;
            System.out.println(name+"...取出:"+money+"..."+Thread.currentThread().getName());
            SelectAcount(name);
        }

2、同步方法

即在需要同步的方法中宣告synchronized

public synchronized void addAcount(String name,int money) {
15             // 存錢
16             count += money;
17             System.out.println(name+"...存入:"+money);
18     }

3、同步鎖

呼叫lock()方法,待同步程式碼執行完之後在釋放鎖unlock()方法。

lock.lock();
        try{
            // 存錢
            count += money;
            System.out.println(name+"...存入:"+money);
        }finally {
            lock.unlock();
        }

~~

死鎖問題

當執行緒同時持有多個鎖時,可能會出現死鎖問題。
即A持有執行緒鎖lock1 、B持有執行緒鎖lock2 。A接下來要呼叫lock2,而B接下來要呼叫lock1 ,同時兩者都不釋放現有鎖,即會造成死鎖現象。

相關文章