Java 如何理解阿克卡使用的CCAS锁定机器?
我刚刚在akka遇到一段代码 下面列出了我感兴趣的核心方法Java 如何理解阿克卡使用的CCAS锁定机器?,java,scala,locking,akka,compare-and-swap,Java,Scala,Locking,Akka,Compare And Swap,我刚刚在akka遇到一段代码 下面列出了我感兴趣的核心方法 /** * A very simple lock that uses CCAS (Compare Compare-And-Swap) * Does not keep track of the owner and isn't Reentrant, so don't nest and try to stick to the if*-methods */ class SimpleLock { val acquired = new
/**
* A very simple lock that uses CCAS (Compare Compare-And-Swap)
* Does not keep track of the owner and isn't Reentrant, so don't nest and try to stick to the if*-methods
*/
class SimpleLock {
val acquired = new AtomicBoolean(false)
def ifPossible(perform: () => Unit): Boolean = {
if (tryLock()) {
try {
perform
} finally {
unlock()
}
true
} else false
}
def tryLock() = {
if (acquired.get) false
else acquired.compareAndSet(false, true)
}
def tryUnlock() = {
acquired.compareAndSet(true, false)
}
有两个相关的子问题
1) 这门课的目的是什么
2) 有关于它如何工作的提示或背景知识吗
我认为,因为这段代码是用JAVA和scala编写的,所以它利用了AtomicBoolean类。
所以我还要添加java标记
欢迎任何意见!不知道为什么会有人投票反对这个问题
相关:
以下是我对代码的理解。它使用获得的(原子布尔)作为互斥。如果任何线程试图获取锁,那么它将设置为true。然后任何其他线程都无法获取锁,因为它们将从acquired中获取true并返回false,直到该线程将此acquired设置回false 由于获得的不是来自集合,因此不会有ABA问题。所以它可以工作
如果我错了,请纠正我。我认为您需要改进您的问题。你到底不明白什么?我只需要一些关于它如何工作的基本概念。谢谢,先生:)这里没有“直到线程完成”,如果你想阻塞,等待锁变为可用,你需要循环tryLock直到它成功(并且你有了锁),谢谢你的正确性。这只是因为我的措辞错误。:-)我会改正的。