java 多线程 - Lock 锁

说明

java.util.concurrent.locks.Lock 是一个类似于synchronized 的线程同步机制
但是 Locksynchronized 更加灵活,提供更多的功能

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


原文出处:https://malaoshi.top/show_1IX4rq66rAP5.html