Java教程

自旋锁、共享锁、独占锁

本文主要是介绍自旋锁、共享锁、独占锁,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

自旋锁

自旋锁原理

当一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将循环等待,然后不断的判断是否可以成功获取锁,直到获取到锁才会退出循环。通过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后缀的方法是支持共享锁加锁的语义

这篇关于自旋锁、共享锁、独占锁的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!