几种锁算法的实现
发布时间:2020-05-25 16:02:28 所属栏目:Java 来源:互联网
导读:几种锁算法的实现
|
下面是脚本之家 jb51.cc 通过网络收集整理的代码片段。 脚本之家小编现在分享给大家,也给大家做个参考。 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);
}
}
CLHLockCLHLockvoid 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
以上是脚本之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。 如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
