其他分享
首页 > 其他分享> > 自旋锁、共享锁、独占锁

自旋锁、共享锁、独占锁

作者:互联网

自旋锁

自旋锁原理

当一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将循环等待,然后不断的判断是否可以成功获取锁,直到获取到锁才会退出循环。通过CAS(compare and swap)算法会用到自旋锁

适应性自旋锁原理

JDK1.6对自旋锁进行了改进,引入了自适应自旋锁,随着程序的运行和性能的监控,JVM会对锁的情况进行预测,从而给出适合的自旋时间,更加智能。

自旋锁存在的问题
  1. 如果一个线程持有锁的时间过长,就会导致其他等待获取锁的线程进入循环等待,消耗CPU, 使用不当会造成CPU使用率过高
  2. 非公平的情况下,无法满足等待时间最长的线程优先获取锁。不公平的锁就会存在’线程饥饿’问题
自旋锁使用注意事项
  1. 自旋锁使CPU处于忙等状态,因此临界区执行时间设置尽量短
  2. 并发写,竞争激烈的场景下,资源冲突概率高,一般尽量少用自旋锁

独占锁

也可以称为互斥锁,就是同时只能有一个线程获取到锁

常用的synchronized,ReentrantLock是独占锁 ReadWriteLock中的写锁是独占锁。

具有独占锁功能的子类使用AQS,必须实现tryAcquire、tryRelease等方法。

共享锁

可以有多个线程同时获取锁

常用的Semaphore(信号量) CountDownLatch都是共享锁

具有共享锁功能的子类使用AQS,必须实现tryAcquireShared、tryReleaseShared等方法 带有shared后缀的方法是支持共享锁加锁的语义

标签:独占,获取,线程,自旋,共享,CPU
来源: https://blog.csdn.net/weixin_50087960/article/details/118345721