之前有說過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();
}