Реализация структур данных без блокировки иногда бывает нелегко реализовать. Следующий подход может показаться обобщенным 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));
}
}