자바에서 ByteBuffer을 얻었습니다.이 바이트를 읽은 다음 조건부로 수정하려고합니다.Java에서 ByteBuffer의 일부를 원자 적으로 읽은 다음에 읽으십시오.
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
입니다.
FileChannel (스레드 세이프)에서 만든 MappedByteBuffer를 사용하게 될 것이므로 매핑 된 버퍼는 안전합니다. –
@Dave - MappedByteBuffer는 파일을 생성하는 데 사용 된 FileChannel에 연결되어 있지 않습니다. 후자는 단순히 * mmap * 시스템 호출에 인수를 제공하는 데 사용됩니다. – kdgregory
java.util.concurrent.lock.ReadWriteLock의 인스턴스를 만들고 사용할 수 있습니다. 특정 '원자 바이트'또는 '원자 바이트 영역'을 읽거나 쓰는 모든 코드가 먼저 해당 바이트/영역에 해당하는 잠금을 가져옵니다. :) –