Вы, конечно, начали в правильном направлении, думая об использовании атомарных целочисленных и атомарных функций Java.Таким образом, это будет стек без блокировок, как в случае: явных блокировок нет.
Однако при одновременном доступе он все еще не корректен, и относительно просто продемонстрировать, что: представьте себе поток push ()блоки между получением счетчика и добавлением нового элемента в стек (data [c] = o), и тем временем появляется поток pop (), получает большее число и выдает ... Что?Что бы ни находилось в памяти в этом месте в стеке, но не в Объекте o (потому что он еще не был вставлен).
И это проблема с безблокировочными стеками с массивами, которые выу вас есть две вещи, которые вам теоретически необходимо отрегулировать, количество и содержимое этой конкретной ячейки, и вы не можете сделать обе атомарно одновременно.Я не знаю ни одного алгоритма стека без массива с поддержкой массива.
Хотя существуют алгоритмы стека с поддержкой связанного списка, которые не имеют блокировки, потому что в этом случае вы можете создать новый узелназначьте ему содержимое, и у вас есть только одна операция для атомарного выполнения: измените верхний указатель.
Если вас интересует аргумент, лучшая литературная работа - «Искусство многопроцессорного программирования» Шавита и Херлихи.", которая описывает множество различных структур данных, как без блокировок, так и на основе блокировок.Сейчас я не могу найти ни одной статьи, подробно описывающей «обычный» алгоритм стека без блокировки, хотя Магед Майкл упоминает его в своей статье SMR , стр. 8, пункт 4.2, и я сделал реализация C99 себя.