说明
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