几种锁算法的实现
发布时间:2020-12-15 03:18:55 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 Abstract TASLock TTASLock CLHLock MCSLock TASLock public class TASLock implements Lock{ AtomicBoolean state = new AtomicBoolean(false); publ
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 Abstract
TASLockpublic class TASLock implements Lock { AtomicBoolean state = new AtomicBoolean(false); public void lock() { while(state.getAndSet(true)) {} } public void unlock() { state.set(false); } } TTASLockpublic class TTASLock implements Lock() { AtomicBoolean state = new AtomicBoolean(false); public void lock() { while (true) { while (state.get()) {}; if (! state.getAndSet(true)) return; } } public void unlock() { state.set(false); } }
CLHLock
CLHLock
void initCLHlock() { q.locked = FALSE; tail = &q; } void lock() { QNode* qnode = (QNode*)pthread_getspecific(myNode); qnode->locked = TRUE; QNode* pred = getAndSet(qnode);//原子的得到队尾,并将qnode设为新的队尾。 pthread_setspecific(myPred,pred); while(pred->locked) { } } void unlock() { QNode* qnode = (QNode*)pthread_getspecific(myNode); qnode->locked = FALSE; QNode* pred = (QNode*)pthread_getspecific(myPred); pthread_setspecific(myNode,pred);//unlock时必须将myNode指向前面的Node } NOTE :
MCSLockpublic class MCSLock implements Lock { AtomicReference<QNode> tail; ThreadLocal<QNode> myNode; public MCSLock() { queue = new AtomicReference<QNode>(null); myNode = new ThreadLocal<QNode>() { protected QNode initialValue() { return new QNode(); } }; } ... class QNode { boolean locked = false; QNode next = null;//与CLHLock相比,多了这个真正的next } } public void lock() { QNode qnode = myNode.get(); QNode pred = tail.getAndSet(qnode); if (pred != null) { qnode.locked = true; pred.next = qnode; //wait until predecessor gives up the lock while(qnode.locked){}//将自己设为true然后spin,看似deadlock } } public void unlock() { QNode qnode = myNode.get(); if (qnode.next == null) //后面没有等待线程的情况 {//------there is a gap!!!! if (tail.compareAndSet(qnode,null)) return; //真的没有等待线程,则直接返回,不需要通知 //wait until predecessor fills in its next field while (qnode.next == null){} } //右面有等待线程,则通知后面的线程 qnode.next.locked = false; qnode.next = null; }
Summary
以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- RateLimiter 源码分析(Guava 和 Sentinel 实现)
- GQL仅适用于Python项目而不适用于Java?
- java.lang.NoSuchMethodError:org.apache.log4j
- java.lang.IllegalStateException: Ambiguous ha
- [LeetCode] 857. Minimum Cost to Hire K Worker
- java – 调用Thread.sleep()与*中断状态*设置?
- 2019秋JAVA第三周课程总结及实验报告(二)
- Java线程之锁对象Lock-同步问题更完美的处理方式
- 如何中断java.util.Scanner nextLine调用
- java高并发系列 - 第21天:java中的CAS操作,jav
热点阅读