Как понять этот механизм блокировки CCAS, используемый в АККА? - PullRequest
0 голосов
/ 05 сентября 2011

Я только что наткнулся на кусок кода в акке.

https://codereview.scala -lang.org / Fisheye / просмотр / ~ сырыми, г = 25521 / Scala-СВН / Scala / багажник / тест / файлы / презентации / 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)
  }

Есть два связанных подвопроса.

1) Какова цель этого класса SimpleLock

2) Любые намеки или базовые знания о том, как это работает?

Я думаю, что поскольку этот код написан как на JAVA, так и на scala, он использует класс AtomicBoolean. Поэтому я бы добавил также тег java.

Любой совет приветствуется! Не уверен, почему кто-то проголосовал за этот вопрос близко.

Связанный:

Кто-нибудь может интерпретировать этот код C ++ (из OpenJDK6) в простой английский?

1 Ответ

1 голос
/ 06 сентября 2011

Вот мое понимание кода. Он использовал приобретенный (AtomicBoolean) в качестве мьютекса. Если какой-либо поток попытается получить блокировку, он установит значение true. тогда любой другой поток не может получить блокировку из-за того, что он получит значение true из полученного и вернет false, пока этот поток не вернет значение false для этого потока.

Так как полученный не из коллекции, у него не будет проблем с ABA. Так что это может работать.

Пожалуйста, поправьте меня, если я ошибаюсь.

...