自旋锁、共享锁、独占锁
作者:互联网
自旋锁
自旋锁原理
当一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将循环等待,然后不断的判断是否可以成功获取锁,直到获取到锁才会退出循环。通过CAS(compare and swap)算法会用到自旋锁
适应性自旋锁原理
JDK1.6对自旋锁进行了改进,引入了自适应自旋锁,随着程序的运行和性能的监控,JVM会对锁的情况进行预测,从而给出适合的自旋时间,更加智能。
自旋锁存在的问题
- 如果一个线程持有锁的时间过长,就会导致其他等待获取锁的线程进入循环等待,消耗CPU, 使用不当会造成CPU使用率过高
- 非公平的情况下,无法满足等待时间最长的线程优先获取锁。不公平的锁就会存在’线程饥饿’问题
自旋锁使用注意事项
- 自旋锁使CPU处于忙等状态,因此临界区执行时间设置尽量短
- 并发写,竞争激烈的场景下,资源冲突概率高,一般尽量少用自旋锁
独占锁
也可以称为互斥锁,就是同时只能有一个线程获取到锁
常用的synchronized,ReentrantLock是独占锁 ReadWriteLock中的写锁是独占锁。
具有独占锁功能的子类使用AQS,必须实现tryAcquire、tryRelease等方法。
共享锁
可以有多个线程同时获取锁
常用的Semaphore(信号量) CountDownLatch都是共享锁
具有共享锁功能的子类使用AQS,必须实现tryAcquireShared、tryReleaseShared等方法 带有shared后缀的方法是支持共享锁加锁的语义
标签:独占,获取,线程,自旋,共享,CPU 来源: https://blog.csdn.net/weixin_50087960/article/details/118345721