多線程 lock

之前有說過synchroniaed 同步,這次來學習下一個另一個同步 lock。
首先來看下幫助文檔:
這裏寫圖片描述
這是lock接口中的所有方法,這次說道的有lock(),unlock(),tryLock(),tryLock(long time, TimeUnit unit)

依然是先上一個結果類

public class Result {
    private int val=0;//結果
    private int pVal = 0;
    private Lock resultLock = new ReentrantLock();

    public void sum(int num){//合方法 
        resultLock.lock();//鎖
        try {
            if(pVal != val){
                pVal = val;
            }
            pVal = val + num;
            Thread.sleep((int) Math.random() * 1000);//模擬事物耗時
            System.out.println(Thread.currentThread().getName()+"調用sum("+num+") 現值:"+pVal);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            resultLock.unlock();//釋放鎖
            System.out.println(Thread.currentThread().getName()+" unlock() ");
        }
        val=pVal;
    }

    public static void main(String[] args) {
        Result rt = new Result();
        for(int t=0;t<5;t++){
            new AddThread(rt,t).start();
        }
    }
}

再寫個添加線程

public class AddThread extends Thread {
    private Result rt ;
    private int add ;

    AddThread(Result rt, int add) {
        this.rt = rt;
        this.add = add;
    }

    @Override
    public void run(){
        rt.sum(add);
    }
}

這裏寫圖片描述

那麼tryLock()的作用是什麼呢?僅在調用時鎖爲空閒狀態才獲取該鎖。 而tryLock(long time, TimeUnit unit) 是如果鎖在給定的等待時間內空閒,並且當前線程未被中斷,則獲取鎖。 TimeUnit 參數:
這裏寫圖片描述

那麼接下來就用用他,只要把sum()代碼修改一點就行了

public void sum(int num){//合方法,這裏用了同步
        //resultLock.lock();
        if(resultLock.tryLock()) {
            try {
                if (pVal != val) {
                    pVal = val;
                }
                pVal = val + num;
                Thread.sleep((int) Math.random() * 1000);//模擬事物耗時
                System.out.println(Thread.currentThread().getName() + "調用sum(" + num + ") 現值:" + pVal);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                resultLock.unlock();
                System.out.println(Thread.currentThread().getName() + " unlock() ");
            }
            val=pVal;
        }
    }

運行結果:
這裏寫圖片描述

這裏我歐文們看到因爲獲取不到鎖因此只加了一次,但是如果用tryLock(long time, TimeUnit unit) (這裏我模擬事物時間是<= 1秒的)因此我設置等待一秒,將代碼修改如下

try {
            if(resultLock.tryLock(1, TimeUnit.SECONDS)) {
            ...
            } catch (InterruptedException e) {
            e.printStackTrace();
        }

這裏寫圖片描述

發佈了35 篇原創文章 · 獲贊 11 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章