之前有说过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();
}