显式锁ReentrantLock

来源:互联网 发布:哈工大人工智能产业园 编辑:程序博客网 时间:2024/05/19 13:59

使用:

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;}@Overridepublic void run() {try {barrier.await();} catch (InterruptedException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (BrokenBarrierException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}try {//这样总数不一定是10000了if(!lock.tryLock(lockWaitTime,TimeUnit.MILLISECONDS)){//指定时间没有获得所就会直接结束线程return;}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.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的性能略优于内置锁。


0 0