0

akka のコードに出くわしました。

https://codereview.scala-lang.org/fisheye/browse/~raw,r=25521/scala-svn/scala/trunk/test/files/presentation/akka/src/akka/util/LockUtil.scala

私が興味を持っている主要なメソッドを以下に示します。

/**
 * 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)
  }

関連するサブクエスチョンが 2 つあります。

1) このクラス SimpleLock の目的は何ですか

2) それがどのように機能するかについてのヒントや背景知識はありますか?

このコードは JAVA と scala の両方で記述されているため、AtomicBoolean クラスを利用していると思います。したがって、Javaタグも追加します。

どんなアドバイスでも大歓迎です!誰かがこの質問に投票する理由がわかりません。

関連している:

この C++ コード (OpenJDK6 から) を平易な英語に解釈できる人はいますか?

4

1 に答える 1

1

これが私のコードの理解です。取得済み(AtomicBoolean)をミューテックスとして使用しました。いずれかのスレッドが lock を取得しようとすると、取得済みが true に設定されます。他のスレッドは、取得済みから true を取得し、この取得済みがこのスレッドによって false に戻されるまで false を返すため、ロックを取得できません。

コレクションから取得したものではないため、ABA の問題はありません。だからそれはうまくいくことができます。

間違っている場合は修正してください。

于 2011-09-06T05:03:16.490 に答える