说明
java.util.concurrent.locks.Lock 是一个类似于synchronized 的线程同步机制
但是 Lock 比 synchronized 更加灵活,提供更多的功能
Lock 是个接口,有一个默认实现类是 ReentrantLock(其他实现类都是子类)
Lock和syncronized的区别
synchronized是Java语言的关键字,Lock是一个接口。synchronized不需要用户去手动释放锁,发生异常或者线程结束时自动释放锁。Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。Lock可以配置公平策略,实现线程按照先后顺序获取锁。提供了
trylock()方法 可以试图获取锁,获取到或获取不到时,返回不同的返回值 让程序可以灵活处理。lock()和unlock()可以在不同的方法中执行,可以实现同一个线程在一个方法中lock(),在后续的其他方法中unlock(),比syncronized灵活的多。
使用
lock()
获取锁,如果获取失败(即:锁已被其他线程获取),则进行 等待,直到获取为止
tryLock()
尝试获取锁,如果获取锁 立即 返回 true,如果获取失败(即:锁已被其他线程获取) 立即 返回 false
tryLock(long time, TimeUnit unit)
如果锁可用 立即 返回true,如果该锁不可用,则处于休眠状态,直到发生以下三种情况之一为止:
- 当前线程获取到该锁
- 当前线程被其他线程中断,并且支持中断获取锁
- 等待指定的时间,如果获得了锁,则返回
true,没获取到锁返回false
unlock()
释放锁。释放锁的操作放在 finally 块中进行,以保证锁一定被被释放,防止死锁的发生。
实现类
参考:
https://blog.csdn.net/m0_50370837/article/details/124471888
https://blog.csdn.net/xyy1028/article/details/107333451