Реализовать мьютекс в Java, используя атомарные переменные - PullRequest
1 голос
/ 09 февраля 2011

Я хочу реализовать мьютекс в Java с использованием атомарных переменных. Я попытался реализовать его, используя алгоритм пекарни Lamport, и он работает. Но я не уверен, как реализовать это, если я не знаю количество потоков раньше.

Кроме того, алгоритм lamport продолжает увеличивать метки, и будет переполнение, как этого избежать?

Ответы [ 2 ]

2 голосов
/ 09 февраля 2011

Создание простой TTAS (тест, тест и набор) спин-блокировки довольно тривиально:

class TTASLock {
  private final AtomicLong thread = new AtomicLong();

  void lock() {
    while (true) {
      if (thread.get() == 0) { // test
        if (thread.compareAndSet(0, Thread.currentThread().getId())) // testAndSet
          return;
      }
    }
  }

  void unlock() {
    thread.compareAndSet(Thread.currentThread().getId(), 0)
  }
}

Это очень простая спин-блокировка.Парадигма test, test и set не является строго обязательной для логического процесса, но является критически важным улучшением производительности, так что в условиях конкуренции поток, ожидающий получения блокировки, не будет постоянно аннулировать строку кэша Level2 с ошибочными операциями CAS.

1 голос
/ 09 февраля 2011

Вы хотите создать или использовать существующий семафор.

Это лучший ответ .

...