gpt4 book ai didi

java - Java 中的 MCS 锁缓存未更新

转载 作者:太空宇宙 更新时间:2023-11-04 07:59:00 26 4
gpt4 key购买 nike

我发现 Java 中的 MCS 锁有一些非常奇怪的缓存行为。基本上,它最多可以工作四个线程(我机器上的核心数量),但会卡住更多线程。当我调试时,我发现程序卡在线路上

while (qnode.locked);

lock() 函数内部。调试时,我可以看到线程的 QNode 之一已锁定设置为 false,但我猜测这是因为调试器导致缓存更新。我只是将“ volatile ”添加到所有变量上,作为绝望的尝试,但无济于事。这是我正在使用的类:

class MCSLock
{
private volatile AtomicReference<QNode> tail;
private volatile ThreadLocal<QNode> myNode;

public MCSLock()
{
tail = new AtomicReference<QNode>(null);
myNode = new ThreadLocal<QNode>()
{
protected QNode initialValue() { return new QNode(); }
};
}

public void lock()
{
QNode qnode = myNode.get();
QNode pred = tail.getAndSet(qnode);
if (pred != null)
{
qnode.locked = true;
pred.next = qnode;
while (qnode.locked);
}
}

public void unlock()
{
QNode qnode = myNode.get();
if (qnode.next == null)
{
if (tail.compareAndSet(qnode, null)) return;
while (qnode.next == null);
}
qnode.next.locked = false;
qnode.next = null;
}

private class QNode
{
volatile boolean locked = false;
volatile QNode next = null;
}
}

最佳答案

我也遇到了同样的问题。 unlock() 方法有一个小错误。在将 false 值设置为下一个节点的锁定变量之前,我们需要等待,直到该值在 lock 方法中变为 true。我添加了

 
while (!qnode.next.locked) {}

qnode.next.locked = false;
进入unlock()方法,问题就消失了!

关于java - Java 中的 MCS 锁缓存未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13144008/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com