使用:
1)普通上锁和释放锁:
lock.lock();
try{
}finally{
lock.unlock();
}
2)定时的轮询,如果指定时间没有得到锁的话就会放弃,例子中的线程就会提前结束:
public class TestTryLock {
static AtomicInteger ii = new AtomicInteger(0);
static int lockWaitTime = 1;
static CyclicBarrier barrier = new CyclicBarrier(10000);
static ReentrantLock lock = new ReentrantLock();
public static void main(String[] args){
for(int i = 0 ; i < 10000 ; i++){
new Thread(new t1(lock, ii , barrier)).start();;
}
}
static class t1 implements Runnable{
ReentrantLock lock;
AtomicInteger i;
CyclicBarrier barrier;
public t1(ReentrantLock lock,AtomicInteger i,CyclicBarrier barrier){
this.lock = lock;
this.i = i;
this.barrier = barrier;
}
@Override
public void run() {
try {
barrier.await();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (BrokenBarrierException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
//这样总数不一定是10000了
if(!lock.tryLock(lockWaitTime,TimeUnit.MILLISECONDS)){
//指定时间没有获得所就会直接结束线程
return;
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try{
System.out.println(i.incrementAndGet());
}finally{
lock.unlock();
}
}
}
}
输出结果肯定不会有10000.3)可中断锁的获取,获取锁的同时会监听中断的请求:
lock.lockInterruptibly();
try{
}finally{
lock.unlock();
}
和synchronized的比较:
1)灵活性:可以显式的释放锁,synchronized像一个定时炸弹,抛出异常,永远无法释放锁,释放锁还可以和异常有很好的交互。
2)简洁性:如果忘记unlock,那么是非常致命的,可能引起死锁。
3)伸缩性:线程越多,synchronized性能下降更厉害,侧面看出ReentrantLock的性能略优于内置锁。