1、Synchronized的不足
(1)试图获取锁时无法设置超时,也无法响应中断
(2)不够灵活,加锁解锁的方式单一(与读写锁对比)
(3)无法法知道是否成功获取了锁
2、Lock接口
(1)lock()与unlock() 用于获取锁释放锁,作用和synchronized作用相同,不同点在于发生异常时synchronized会自动释放锁,而lock()必须通过unlock()手动释放
(2)tryLock():Boolean立刻尝试获取锁,获取到返回true,未获取到返回false;如果返回true,要手动释放锁。标准用法:
(3)tryLock(Long,TimeUnit):Boolean 在一定时间内尝试获取锁,获取锁成功返回true,超时或被中断返回false。
代码实例:线程1先请求锁1后请求锁2,线程2先请求锁2后请求锁1;通过使用tryLock能够避免死锁的发生。
(4)lockInterruptibly()和tryLock(Long,TimeUnit)都能响应中断,tryLock()会马上返回所以无法响应中断,lock()不响应中断。
3、Lock的可见性