一马平川
不积跬步无以至千里,后继才能薄发

Java中的显式锁

2022年03月02日
0
未分类

Lock

Lock接口的实现必须提供和内置锁相同的内存可见性语义,但在加锁语义、调度算法、顺序保证和性能上可以不同。

ReentrantLock

ReentrantLock 实现了与 synchronized 相同的可重入锁实现,并且在 java1.6 之后性能相差无几。对比 synchronizedReentrantLock 实现了可定时、可轮询、可中断的获取锁操作。

注意点:使用 ReentrantLock 必须使用 try-finally 在finally代码块中释放锁。

公平锁&非公平锁

公平锁保证了后请求锁的线程,会在之前请求锁的线程之后获取到锁,但是这会极大降低性能,因为线程的挂起和恢复需要的cpu周期很长。

非公平锁提供了 插队 的功能,在线程A释放锁,线程B恢复线程的时间中,线程C可以 插队 获取到锁、使用、释放锁,线程B获取到锁的时机没有变化或者略微推延,这样就提高了吞吐量。

读-写锁

可选项:

  • 释放优先:在释放读锁或者写锁时,如果在等待的线程有等待读锁也有等待写锁的,优先给读锁还是写锁。
  • 读线程插队:在读锁被获取后,并且有线程在等待写锁,新的线程过来获取读锁能否立刻获取读锁,或者是等待写锁获取后再获取读锁,这里可能会引发饥饿问题。
  • 重入性:读锁和写锁是否可重入
  • 降级:获取写锁之后能否在不释放锁的情况下降级成读锁。
  • 升级:获取读锁之后能否在不释放锁的情况下升级成写锁。大部分读写锁实现中不会支持升级,因为如果两个读锁持有的线程同时申请写锁,就会造成死锁

如果喜欢这篇文章,可以给作者评个份哦~

原文声明: "转载本站文章请注明作者和出处Nothinglin ,请勿用于任何商业用途"

公众号:苦逼的学生仔