<1>ReentrantLock lock=new ReentrantLock();
//获得锁 lock.lock(); //释放锁 lock.unlock();
<2>一个线程可以连续两次获得同一把锁,但是在释放锁的时候必须释放相同的次数,
释放的次数多,会报java.lang.IllegalMonitorStateException异常;如果释放的次数少,
相当于该线程仍然持有该锁,其它线程则无法进入临界区
<3>锁申请等待限时:lock.tryLock(5,TimeUtil.SECONDS);
5秒申请成功,返回true;否则返回false
也可以不带参数执行,申请锁成功,立即返回true,否则返回false
<4>中断响应:
对于synchronized来说,如果一个线程在等待锁,只有两种情况:
获得锁继续执行或者继续等待;对于重入锁来说:还可以响应中断。
即在申请锁的过程中,被中断,可放弃对锁的申请,预防死锁
<5>公平锁:
对于synchronized来说,锁是非公平的;重入锁允许我们进行锁的公平性设置
new ReentrantLock(true);
重入锁的实现,主要包含三个方面:
<1>是原子状态,原子状态使用cas操作来存储当前锁的状态,判断锁是否被别的线程持有
<2>是等待队列:所有没有请求到锁的线程,会进入等待队列进行等待,待有线程释放锁后,就能从等待队列中唤醒一个线程,继续工作
<3>是阻塞原语,用来挂起和恢复线程
Condition对象:
<1>构造:lock.newCondition();会生成一个与当前重入锁绑定的condition对象
<2>方法:await:使当前线程等待,同时释放当前锁,当其他线程使用signal或signall方法时,线程会继续获得锁并继续执行,或者当线程中断时,也能跳出等待
signal:唤醒一个在等待中的线程; signall:唤醒等待中的所有线程
awaitUninterrucptily:并不会在等待过程中响应中断