原子读取然后在Java中写入ByteBuffer的一部分

Dav*_*lis 4 java memory concurrency

我在java中有一个ByteBuffer,想要读取,然后有条件地修改该字节,例如使用如下方法:

public void updateByte(int index) {
    byte b = this.buffer.getByte(index);

    if (b == someByteValue) {
        this.buffer.setByte(index, someNewByte);
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能确保读取然后修改一个字节以原子方式发生?

我不想同步整个ByteBuffer或updateByte方法,因为我希望多个线程能够同时读/写缓冲区的不同字节(即updateByte只要index不同就可以被许多线程同时调用).

我正在使用的ByteBuffer没有byte []支持,所以bb.hasArray() == false在上面的例子中.

DNA*_*DNA 5

如何为ByteBuffer的部分提供一组显式锁定对象(部分可能非常小,例如一个字,或者相当大,例如四个四分之一缓冲区)?

当一个线程要检查并修改一个字节时,它必须首先获取相应部分的锁,执行其工作,然后释放锁.

这将允许多个线程访问数据的不同部分,而不需要全局同步.