Java中除了Synchronized锁还有一种Lock接口,而ReentrantLock是其中比较突出的一种。
ReentrantLock通过CAS 算法和AQS来实现线程的同步,Synchronized 通过把资源锁起来的方式,实现线程的同步执行,而ReentrantLock 是通过把多线程进入同步锁来使线程达到同步的效果。
ReentrantLock是一个可重入独占锁。
使用方法
ReentrantLock 通过显示的去操作,何时枷锁何时放锁都在程序员的控制下
ReentrantLock lock = new ReentrantLock();
lock.lock();
lock.unlock();
tryLock、lock、lockInterrupt 的区别
TryLock 若有可用锁,则获取该锁并返回true,否则返回false,不会有延迟或者等待,tryLock()可以增加时间限制,如果超过了指定时间还没有获得锁,则返回false。
Lock 若有可用锁,则获取该锁并返回true,否则会一直等待直到获取可用锁。
在锁中断时lockInterruptibly 会抛出异常,lock不会。
Synchronized 和ReentrantLock的比较
Synchronized 和ReentrantLock 的共同点。
·都是同步线程使用的
·都是可重入锁
·都保证了可见性和互斥性
不同点
ReentrantLock 显示的获取和释放锁;synchronized 隐式的获取释放锁。
ReentrantLock 可影响中断,可轮回,为处理锁提供了更多的灵活性
ReentrantLock 是API级别的,synchronized是jvm级别的。
两者底层实现不同,Synchronized 是同步阻塞,采用的是悲观的并发策略,Lock是同步非阻塞,采用的是乐观并发策略。