多线程环境中的字节缓冲区

时间:2019-01-04 08:07:22

标签: java multithreading bytebuffer

class RequestMessage{

public byte[] getMsgAsBytes() throws UnsupportedEncodingException{
        ByteBuffer reqBuffer = ByteBuffer.allocate(PAYLOAD_SZ);
        reqBuffer.put(xxx);
        reqBuffer.putInt(xxx);
        reqBuffer.put(xxx);
        reqBuffer.position(0);
        return reqBuffer.array();
    }
}

然后,单例以下列方式使用RequestMessage类(read-only)。单例将被串联访问多个线程。

private void sendRequest(...) throws Exception {
        RequestMessage reqMessage = new RequestMessage( );
        gateway.sendAsyncMessage(...., reqMessage.getMsgAsBytes());

}

这种字节缓冲区是线程安全的用法吗?
我们确实偶尔会发现数组内容损坏,因此需要确定原因。

2 个答案:

答案 0 :(得分:0)

如果xxxRequestMessage的实例字段,则它是线程安全的:由于RequestMessageByteBuffer都是局部变量,因此不能更改它们通过另一个线程。

答案 1 :(得分:0)

观察到的腐败由什么组成?

如果这些xxx是RequestMessage的实例字段 并且它们是不可变的 (表示没有设置器,并且它们的值在构造函数调用时设置并固定) 并且构成xxx的任何对象的状态本身也是不可变的 ,那么事物应该是廉洁的。

否则,无法避免偶发损坏,因为如果系统的某些其他部分认为应该这样做,则无法避免将对象传递给其他线程。而且,没有任何方法可以避免在读取状态时以无法预测的方式和/或顺序准确地改变状态。