reentrantlock指的是可重入锁,concurrent包下面,
private Lock lock = new ReentrantLock(); public void test(){ lock.lock(); try{ do(); }catch (Exception e){ throw e; }finally { lock.unlock(); } }
reentrantlock和synchronized很像 都是重入锁
但是感觉reentrantlock更加强大
- reentrantlock 比synchronized 更加灵活 synchronized 加锁中必须按顺序加减锁 reentrantlock 随意
- reentrantlock可以指定公平锁和非公平锁
- reentrantlock 可以中断阻塞队列中的线程
- reentrantlock可以指定唤醒一个线程 synchronized随机唤醒 notify()
- 公平锁保证操作顺序 保证每个都执行
final void lock() { //cas方法比较状态是否为1,如果为0,就把状态改为1,并获得锁 if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); //否则就再次请求一次。 else acquire(1); }
acquire源码
/**抢占模式或者非公平锁*/ final boolean nonfairTryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { //会在去比较一次 if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } //是自己占有了锁,重入锁,那就可以再次获得锁,然后修改state } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) // overflow throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; }
- 公平锁 :有一个queue,阻塞后按顺序加入进去,然后按顺序取出执行。
- 非公平锁: 抢占锁,不按顺序都可以有机会枪战锁,源码基于链表的结构。
从上面可以看出重入锁只是指的是 如果当前线程拥有资源的锁时候,就可以再次获得锁资源