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
在上面的例子中.
如何为ByteBuffer的部分提供一组显式锁定对象(部分可能非常小,例如一个字,或者相当大,例如四个四分之一缓冲区)?
当一个线程要检查并修改一个字节时,它必须首先获取相应部分的锁,执行其工作,然后释放锁.
这将允许多个线程访问数据的不同部分,而不需要全局同步.