数据库锁定时使用自旋锁的优缺点

时间:2016-09-02 20:13:39

标签: java multithreading scala jvm

我有以下三种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是最佳选择。但是,我也觉得由于上下文切换会浪费时间。

编辑:我不是在询问"我应该同步哪些对象?"。我想知道的是"我应该如何同步对象(我知道)"?

0 个答案:

没有答案