Lock不是替代synchronize ,提供了更高级的功能
Lock接口的最常见实现类是ReentrantLock
通常情况下Lock只允许一个线程可以访问共享资源,不过有时候一些特殊实现允许并发访问,比如ReadWriteLock 里面的ReadLock
Synchronize 不够用?
1、效率低,锁释放情况少,试图获取锁时不能超时,不能中断一个正在试图获取锁的线程
2、不够灵活 读写锁更加灵活
加锁释放锁时机单一,每个锁仅有单一条件,可能是不够的
3、无法知道是否成功获取锁
synchronized方法或声明执行期间,如程序遇到任何异常或return,线程都会释放锁。
Lock
lock()
就是普通的获取锁,如果被其他人已经获取,自己等待,不会像synchronize一样异常情况下释放锁
最佳实践是在finally里手动释放锁
lock方法不能被中断,一旦陷入死锁,lock()将会陷入永久等待
tryLock()
如果能获取锁则立刻返回true,如果拿不到立刻false
tryLock(long,TimeUnit)
有一个超时时间,超时就放弃
lockInterruptibly()
相当于tryLock 时间设置为无限,等待获取锁过程中可以被中断,获取锁后也可以被打断
Lock也可以保证可见性
网友评论