У меня есть ByteBuffer в java, и вы хотите прочитать, затем условно изменить этот байт, например. с использованием метода, такого как:Атомное чтение, а затем запись части ByteBuffer в Java
public void updateByte(int index) {
byte b = this.buffer.getByte(index);
if (b == someByteValue) {
this.buffer.setByte(index, someNewByte);
}
}
Как я могу убедиться, что чтение, а затем изменение байта происходит атомарно?
Я не хочу, чтобы синхронизировать весь ByteBuffer или updateByte
метода, так как я хочу несколько потоков, чтобы иметь возможность читать/писать различные байты буфера одновременно (т.е. updateByte
можно назвать одновременно многими нитями, как длинный как index
- другой).
ByteBuffer, который я использую, не поддерживается байтом [], поэтому bb.hasArray() == false
в приведенном выше примере.
Это правда, я буду использовать MappedByteBuffer, созданный из FileChannel (который является потокобезопасным), поэтому я предположил, что отображаемый буфер будет безопасно тоже. –
@Dave - MappedByteBuffer не имеет никакого отношения к FileChannel, используемому для его создания. Последний просто используется для предоставления аргументов системному вызову * mmap *. – kdgregory
Вы можете создать и использовать свои собственные экземпляры java.util.concurrent.lock.ReadWriteLock. Все коды, которые читают/записывают в конкретный «атомный байт» или «атомный байтовый регион», сначала вынимают соответствующую блокировку для этого байта/региона. :) –