java的CLH队列锁是什么


本篇内容介绍了“java的CLH队列锁是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!CLH队列锁是一 香港云主机种自旋锁,提供先来先服务的公平性。CLH基于链表实现。线程只是在不断的自旋,不断地轮询前驱节点的状态,如果前驱节点释放了锁,那么线程结束自旋。
对于持锁时间很短的场景,比之间把线程阻塞住具有较高的性能,并能可以保持一定的公平性。
还有搭配自旋次数做深入的优化,使得使用场景更广,性能更好。对于特定应用场景,使用这种锁可以提高性能,是一种锁的优化方向。核心理念就是,不要阻塞线程,用循环来替换。
一种LCH参考实现
*值得注意这个节点的默认值是false也就是说如果前驱节点是这个默认的节点那么它是不会起到锁的作用
*即第一个线程进来执行lock()操作之后立即返回
*
*还有所有就是所有的线程都共享这个tail引用
*链表推进是依靠这个共享的tail
*/
privatefinalAtomicReferencetail=newAtomicReference(newNode());

publicClhSpinLock(){
}

/**
*1.初始状态tail指向一个node(head)节点
*+——+
*|head|
*2.lock-thread加入等待队列:tail指向新的Node,同时Prev指向tail之前指向的节点
*+———-+
*|Thread-A|
*|:=Node|+——+
*+———-+|head|
*+——+
*

*+———-++———-+
*|Thread-B||Thread-A|
*tail—->|:=Node|–>|:=Node|
*|:=Prev|—-||:=Prev|—–>+——+
*+———-++———-+|head|
*+——+
*3.寻找当前node的prev-node然后开始自旋
*/
@Override
publicvoidlock(){
//值得注意的细节
//如果是第一个线程进来
//那么pred.locked是false所以这个线程调用lock之后就直接返回了

//第二个线程进来之后它的pred就是第一个线程的
//之后的线程以此类推

finalNodecurrentThreadNode=this.currentThreadNode.get();
currentThreadNode.locked=true;

//所有线程都通过这个tail的不断变换去推进
finalNodeprev=this.tail.getAndSet(currentThreadNode);
//这个只是满足每个线程自己prev的设置其实是可以省略掉的
this.prev.set(prev);

//自旋
while(prev.locked){

}
}

@Override
publicvoidunlock(){
finalNodenode=this.currentThreadNode.get();
node.locked=false;

this.currentThreadNode.set(this.prev.get());
}

@Override
publicvoidlockInterruptibly()throwsInterruptedException{

}

@Override
publicbooleantryLock(){
returnfalse;
}

@Override
publicbooleantryLock(longtime,TimeUnitunit)throwsInterruptedException{
returnfalse;
}

@Override
publicConditionnewCondition(){
returnnull;
}

privatestaticclassNode{
privatevolatilebooleanlocked;
}
}


*+———-++———-+
*|Thread-B||Thread-A|
*tail—->|:=Node|–>|:=Node|
*|:=Prev|—-||:=Prev|—–>+——+
*+———-++———-+|head|
*+——+
*3.寻找当前node的prev-node然后开始自旋
*/
@Override
publicvoidlock(){
//值得注意的细节
//如果是第一个线程进来
//那么pred.locked是false所以这个线程调用lock之后就直接返回了

//第二个线程进来之后它的pred就是第一个线程的
//之后的线程以此类推

finalNodecurrentThreadNode=this.currentThreadNode.get();
currentThreadNode.locked=true;

//所有线程都通过这个tail的不断变换去推进
finalNodeprev=this.tail.getAndSet(currentThreadNode);
//这个只是满足每个线程自己prev的设置其实是可以省略掉的
this.prev.set(prev);

//自旋
while(prev.locked){

}
}

@Override
publicvoidunlock(){
finalNodenode=this.currentThreadNode.get();
node.locked=false;

this.currentThreadNode.set(this.prev.get());
}

@Override
publicvoidlockInterruptibly()throwsInterruptedException{

}

@Override
publicbooleantryLock(){
returnfalse;
}

@Override
publicbooleantryLock(longtime,TimeUnitunit)throwsInterruptedException{
returnfalse;
}

@Override
publicConditionnewCondition(){
returnnull;
}

privatestaticclassNode{
privatevolatilebooleanlocked;
}
}相关的测试代码空间复杂度低在不同CPU结构体系下,性能是不同的。“java的CLH队列锁是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注开发云网站,小编将为大家输出更多高质量的实用文章!

相关推荐: xp老爷机优化升级的方法是什么

本篇内容介绍了“xp老爷机优化升级的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!第一个问题:如何定义老爷机?服役三年以上的中低端本或服役四年以上的中…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 08/15 09:07
下一篇 08/15 09:07

相关推荐