多线程之--synchronized 和reentrantlock的优缺点
多线程之--2种JAVA乐观锁的比较( NonfairSync VS. FairSync)
本文从成员函数和锁的获取这2个角度, 比较这2种锁. 发现区别其实不大.只有在阻塞队列为0的时候才有些许区别. 如果分析的不对,请斧正.
稍后如果有时间,准备使用实例来测试一下.
成员函数的比较
从下面的截图可以清晰的看到除了构造函数不一样,其他的都一样.重点是都只有lock() 和 tryAcquire(), 那从另一个角度也可以说明,只有锁的获取是不一样的,锁的释放和从阻塞队列选取线程来激活的方法是一样的.
锁的获取
下面是相关的源码,然后通过三种场景比较区别
- //NonfairSync
- final void lock() {
- if (compareAndSetState(0, 1))
- setExclusiveOwnerThread(Thread.currentThread());
- else
- acquire(1);
- }
- //FairSync
- final void lock() {
- acquire(1);
- }
1)在资源没有被占用的情况下:
非公平锁是: 先state+1,然后直接得到锁,
而公平锁则是: 先尝试去获取锁,如果得到了锁则state+1.
2)如果是同一线程,再次申请锁.
两种锁,表现基本一致,可以参考下面的代码块. (只是这段代码块在不同函数中)
- <span style="font-size: 1em; line-height: 1.5;">//NonfairSync : Sync.</span>nonfairTryAcquire()<span style="font-size: 1em; line-height: 1.5;">
- //FairSync</span> : FairSync.tryAcquire()
- else if (current == getExclusiveOwnerThread()) {
- int nextc = c + acquires;
- if (nextc < 0) // overflow
- throw new Error("Maximum lock count exceeded");
- setState(nextc);
- return true;
- }
3)如果是不同线程申请锁:
从业务逻辑来看,公平锁和非公平锁唯一的区别就是需要判断当前线程是不是链表头.但是一直有一点不明白的,在c==0的情况下, 不是就可以说明已经是表头了吗? 为什么还要检查 isFirst(current). compareAndSetState(0, acquires) 也可以保证在并发的情况下只有state=0才能获取锁.
- //FairSync : FairSync.tryAcquire()
- if (c == 0) {
- if (isFirst(current) && //唯一的区别
- compareAndSetState(0, acquires)) {
- setExclusiveOwnerThread(current);
- return true;
- }
- }
总结
非公平锁,和公平锁只有在state=0的时候,业务逻辑不一样.
- 在stage=0的时候,非公平锁是直接获取锁,没有维护等待队列.
- 在stage=0的时候, 公平锁依然需要检查当前线程是否是等待队列的第一个.
相关推荐
java,乐观锁,悲观锁详解释
JAVA架构面试专题_面试必备之乐观锁与悲观锁.pdf
java乐观锁java乐观锁
面试必备之乐观锁与悲观锁.zip
面试必备之乐观锁与悲观锁.pdf
db2 数据库驱动jar包 db2java.jar,db2jcc.jar,db2_license_cu.jar
乐观锁适用于多读的应用类型,这样可以提高吞吐量,在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS(Compare and Swap 比较并交换)实现的。 悲观锁:总是假设最坏的情况,...
db2java.jar db2java.jar db2java.jar db2java.jar
主要介绍了java乐观锁原理与实现,结合具体案例形式分析了乐观锁的原理及java使用乐观锁实现自动派单功能的相关操作技巧,需要的朋友可以参考下
这是一本以面试题为入口讲解 Java 核心内容的技术书籍,书中内容极力的向你证实代码是对数学...2. 想阅读 Java 核心源码,但总感觉看不懂的 3. 看了太多理论,但没有实践验证的 4. 求职面试,总被面试题搞的死去活来的
Java 中的悲观锁和乐观锁的实现 纯开发技巧。
java.applet java.awt java.awt.color java.awt.datatransfer java.awt.dnd java.awt.event java.awt.font java.awt.geom java.awt.im java.awt.im.spi java.awt.image java.awt.image.renderable java....
乐观锁version 对于在Hibernate中的乐观锁和悲观锁的学习
Java KeyStore文件转换为...Java Runtime的目录,指包含Java.exe和keytool.exe的目录,如: c:\progra~1\Java\jre1.5.0_06\bin 例如: JKS2PFX server.jks 123456 tomcat exportfile c:\progra~1\Java\jre1.5.0_06\bin
What is smali2java? Smali2java is an utility for converting .smali to .java files without bytecode compiling/decompiling. Why not to use dex2jar? I have never told about it. Dex2jar is a good utility...
Java.Concurrency.in.Practice.pdf
经典面试学习知识
selenium-java-2.47.1.zip,2015年8月更新
<Call Stack = DEBUG_FRAME = org.apache.axis2.util.JavaUtils.callStackToString(JavaUtils.java:564) DEBUG_FRAME = org.apache.axis2.description.ParameterIncludeImpl.debugParameterAdd(ParameterIncludeImpl...