То, что на самом деле происходит здесь, это метод remove, который подготавливает поток опроса для обнуления связанной ссылки.
ConcurrentLinkedQueue является неблокирующей потокобезопасной реализацией очереди. Однако, когда вы пытаетесь опросить узел из очереди, это процесс с двумя функциями. Сначала вы обнуляете значение, а затем обнуляете ссылку. Операция CAS - это отдельная элементарная функция, которая не обеспечивает непосредственного разрешения для опроса.
Что происходит при опросе, так это то, что первый успешный поток получит значение узла и обнулит это значение, этот поток затем попытается обнулить ссылку. Вполне возможно, что затем придет другой поток и попытается опросить из очереди. Чтобы убедиться, что в этой очереди хранится неблокирующее свойство (то есть, сбой одного потока не приведет к отказу другого потока), этот новый входящий поток увидит, имеет ли значение значение NULL, если он равен NULL, этот поток обнулит ссылку и попытается снова опросить ().
Итак, вы видите, что поток удаления просто подготавливает любой новый поток опроса к нулевой ссылке. Попытка достичь неблокирующей функции удаления, я думаю, почти невозможна, потому что для этого потребуются три атомарные функции. Нулевое значение, значение NULL, ссылающееся на указанный узел, и, наконец, новая ссылка от родительского узла к его преемнику.
Чтобы ответить на ваш последний вопрос. Не существует лучшего способа реализовать удаление и поддержание неблокирующего состояния очереди. Это по крайней мере на данный момент. Как только процессоры начнут выходить с 2-х и 3-х сторонним корпусом, это станет возможным.