Когда речь заходит об алгоритмах блокировки свободных или ожидающих данных структур, некоторые алгоритмы украдут 2 младших значащих бита из указателя, поскольку они не используются, и используют их как статус бит (например, если узел логически удален или что-то еще). Я понял, что в java, я бы просто использовал AtomicStampedReference вместо того, чтобы красть бит. Однако я понял, что единственный способ решить проблему ABA в java - использовать AtomicStampedReference, чтобы отслеживать, был ли изменен узел или нет.Java - Как реализовать разбиение бит по ссылкам
ПРИМЕЧАНИЕ: Если your'e не уверен, что проблема ABA есть, википедия дает прекрасный пример, объясняющий, как плохо все портится, на него: https://en.wikipedia.org/wiki/ABA_problem
Примечание: Причина, я говорю единственный способ решить проблема ABA является использование AtomicStampedReference основано на этом посту: http://tutorials.jenkov.com/java-util-concurrent/atomicstampedreference.html#atomicstampedreference-and-the-a-b-a-problem
Так, так как я не могу использовать целое число в атомной штампованной ссылке отслеживать такие вещи, как логическое удаление больше, есть способ, которым я может украсть неиспользуемые биты в самой ссылке? Я пытался получить доступ к «небезопасный» пакет, чтобы сделать эту задачу по телефону:
import sun.misc.Unsafe;
Но когда я делаю это, я получаю следующее сообщение об ошибке из Eclipse:
Ограничение доступа: Тип небезопасный не доступен из-за ограничения на требуемую библиотеку C: \ Program Files \ Java \ jre1.8.0_40 \ lib \ rt.jar
У кого-нибудь есть идеи? Если вам любопытно, что я пытаюсь сделать, я пытаюсь реализовать поточный безопасный блокирующий хэш-файл в Java как школьный проект. И мне нужно использовать 2 бита LSB, чтобы различать 3 разных типа узлов: узел данных (00), выделенный узел данных (01) или узел массива (10)
EDIT: Следует упомянуть, Мне нужно, чтобы 2 бита состояния находились внутри атомной ссылки. Причина, по которой мне это нужно, - это то, что я буду выполнять операции сравнения и свопинга, и мне нужно сравнить и сменить, если узел данных (00) будет помечен (01) или преобразован в arrayNode (10). Первоначально я использовал целое число в AtomicStampedReference для этого, но я больше не могу этого делать, поскольку AtomicStampedReference следует зарезервировать для предотвращения проблем, вызванных ABA.
Если вам нужны два бита, просто использовать [ 'BitSet'] (http://docs.oracle.com/javase/8/docs/api/java/util/BitSet.html). Кроме того, Java не ** имеет ** указатели *. –
хорошо, проблема в том, что мне нужны биты, которые будут в атомной ссылке. Причина этого заключается в том, что я собираюсь выполнить сравнение и установить, и я хочу, чтобы сравнение и установка не выполнялись, если узел данных (00) получает отметку (01) или превращается в узел массива (10). –
Я не думаю, что у вас есть то, что вы хотите. Бит-кража делает предположение, что существует случайное бессмысленное пространство для царапин, и это неточно в Java на модели JVM или уровне реализации. – chrylis