我有以下三种Scala代码变体,它们将某些方法作为输入并以原子方式调用它。该方法可以具有一些db / read写操作等。我事先并不知道它会采用什么方法,除非它终止于< 100毫升。为了简洁而粘贴Scala代码,但想象一下Java版本应该很简单。
val locked = new java.util.concurrent.atomic.AtomicBoolean(false)
def usingAtoimcSleepLock[T](f: => T):T = {
while (! locked.compareAndSet(false, true)) {Thread.sleep(10)}
try f
finally locked.set(false)
}
def usingAtoimcSpinLock[T](f: => T):T = {
while (! locked.compareAndSet(false, true)) { /* do nothing */ }
try f
finally locked.set(false)
}
def usingAtoimcTimeoutLock[T](f: => T):T = {
var ctr = 0
while (! locked.compareAndSet(false, true)) {
if (ctr > 1000) throw new Exception("lock could not be opened")
ctr = ctr + 1
// can add Thread.sleep
}
try f
finally locked.set(false)
}
推荐以上3种方法中的哪一种?特别推荐usingAtomicSpinLock
?
我认为usingAtomicTimeoutLock
Thread.sleep
是最佳选择。但是,我也觉得由于上下文切换会浪费时间。