摘要:在并发编程学习之显示锁里有提过公平锁和非公平锁,我们知道他的使用方式,以及非公平锁的性能较高,在源码分析的基础上,我们看看和的区别在什么地方。而非公平锁直接尝试获取锁。
在java并发编程学习之显示锁Lock里有提过公平锁和非公平锁,我们知道他的使用方式,以及非公平锁的性能较高,在AQS源码分析的基础上,我们看看NonfairSync和FairSync的区别在什么地方。
lock方法//非公平锁NonfairSync final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else acquire(1); } //公平锁FairSync final void lock() { acquire(1); }
从源码可以看出,获取锁的时候,非公平锁会先尝试获取,获取不到再调用acquire方法,而公平锁直接调用acquire方法。
tryAcquire方法////非公平锁NonfairSync protected final boolean tryAcquire(int acquires) { return nonfairTryAcquire(acquires); } final boolean nonfairTryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) // overflow throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; } ////公平锁FairSync protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState();//无线程占用 if (c == 0) { if (!hasQueuedPredecessors() &&//看是否有前面节点在等待 compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; }
从源码可以看出,公平锁再尝试获取锁的时候,先判断队列是否有其他节点在等待,没有再获取。而非公平锁直接尝试获取锁。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/77909.html
摘要:显示锁和内置锁内置锁优势代码简洁不会因为没释放锁,导致锁泄露。显示锁优势灵活性强,锁的获取可以被中断,可以尝试获取锁。接口接口主要方法如下获取锁尝试获取锁,表示未加锁的情况。会进行抢锁操作,如果获取不到锁,也会进入阻塞队列等到唤醒。 显示锁和内置锁 内置锁(Synchronized)优势 代码简洁 不会因为没释放锁,导致锁泄露。 显示锁(Lock)优势 灵活性强,锁的获取可以被中...
摘要:公平锁为了保证时间上的绝对顺序,需要频繁的上下文切换,而非公平锁会降低一定的上下文切换,降低性能开销。因此,默认选择的是非公平锁,则是为了减少一部分上下文切换,保证了系统更大的吞吐量。ReentrantLock简介ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁, 支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻...
摘要:公平锁为了保证时间上的绝对顺序,需要频繁的上下文切换,而非公平锁会降低一定的上下文切换,降低性能开销。因此,默认选择的是非公平锁,则是为了减少一部分上下文切换,保证了系统更大的吞吐量。ReentrantLock简介ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁, 支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻...
摘要:公平锁为了保证时间上的绝对顺序,需要频繁的上下文切换,而非公平锁会降低一定的上下文切换,降低性能开销。因此,默认选择的是非公平锁,则是为了减少一部分上下文切换,保证了系统更大的吞吐量。ReentrantLock简介ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁, 支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻...
摘要:的主要功能和关键字一致,均是用于多线程的同步。而仅支持通过查询当前线程是否持有锁。由于和使用的是同一把可重入锁,所以线程可以进入方法,并再次获得锁,而不会被阻塞住。公平与非公平公平与非公平指的是线程获取锁的方式。 1.简介 可重入锁ReentrantLock自 JDK 1.5 被引入,功能上与synchronized关键字类似。所谓的可重入是指,线程可对同一把锁进行重复加锁,而不会被阻...
阅读 2642·2021-11-25 09:43
阅读 2431·2021-09-22 15:29
阅读 963·2021-09-22 15:17
阅读 3585·2021-09-03 10:36
阅读 2201·2019-08-30 13:54
阅读 1720·2019-08-30 11:23
阅读 1144·2019-08-29 16:58
阅读 1271·2019-08-29 16:14