общая c синхронизация без блокировки - PullRequest
1 голос
/ 07 февраля 2020

Реализация структур данных без блокировки иногда бывает нелегко реализовать. Следующий подход может показаться обобщенным c и простым, но я думаю, что здесь у нас есть некоторые проблемы:

private AtomicBoolean lock = new AtomicBoolean(false);

    public void func(...) {
        while !lock.compareAndSet(false,true);
        // Some code goes here...
        ...
        ...
        ...
        lock.set(false); 
    }
}

Я думаю, что приведенный выше код на самом деле не «без блокировки», поскольку он блокирует ожидающие потоки в в то время как l oop в режиме ожидания занятости.

Поэтому код подходит только тогда, когда «правильная» синхронизация без блокировки невозможна.

Мой вопрос - возможно ли это? реализовать обобщенный c без блокировки с другим подходом, и он будет работать, чтобы потоки не были в заблокированном (например, синхронизированном) или в режиме занятости и код работал параллельно, поэтому мы повышаем производительность?

Моя цель - поддерживать работу потоков. Я знаю, что если код длинный, лучше использовать синхронизированный механизм вместо реализации без блокировки, поэтому давайте предположим, что мы говорим о коротком коде.

Например, ниже приведен пример Linkedlist, который Я думаю, что это хороший подход, но он не является общим c для общих структур данных. если мы будем использовать здесь с AtomicBoolean, как я покажу выше, он не будет действительно «без блокировки».

public class LinkedList<T> {

    private AtomicReference<Link<T>> head = new AtomicReference(null);

    public  void add(T data) {
      Link<T> localHead;
      Link<T> newHead = new Link<>(null, data);

      do {
        localHead = head.get();
        newHead.next = localHead;        
      } while (!head.compareAndSet(localHead, newHead));
    }
}

1 Ответ

0 голосов
/ 09 февраля 2020

Действительно, существуют универсальные схемы построения для алгоритмов без блокировки или даже без ожидания. Например:

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

Если вы заинтересованы в области программирования без блокировок, я бы рекомендовал начать с книги Искусство многопроцессорного программирования .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...