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());
}
这种字节缓冲区是线程安全的用法吗?
我们确实偶尔会发现数组内容损坏,因此需要确定原因。
答案 0 :(得分:0)
如果xxx
是RequestMessage
的实例字段,则它是线程安全的:由于RequestMessage
和ByteBuffer
都是局部变量,因此不能更改它们通过另一个线程。
答案 1 :(得分:0)
观察到的腐败由什么组成?
如果这些xxx是RequestMessage的实例字段 并且它们是不可变的 (表示没有设置器,并且它们的值在构造函数调用时设置并固定) 并且构成xxx的任何对象的状态本身也是不可变的 ,那么事物应该是廉洁的。
否则,无法避免偶发损坏,因为如果系统的某些其他部分认为应该这样做,则无法避免将对象传递给其他线程。而且,没有任何方法可以避免在读取状态时以无法预测的方式和/或顺序准确地改变状态。