Java: ByteBuffer在多线程中使用需要注意
昨天我改写一个文件缓存方面程序时,用ByteBuffer替换以前用的byte[],在测试的时候抛出异常。
以前的相关代码:
class A
{
byte[] data;
.......
public byte[] getData()
{
return data;
}
}
使用ByteBuffer改写:
class A
{
ByteBuffer buf;
.......
public ByteBuffer getData()
{
buf.position(0);
return buf;
}
}
需要在多线程环境中调用:
class B
{
public void xxx()
{
ByteBuffer buf = ByteBuffer.allocate(16 * 1024);
buf.put(A.getData()); //需要在多线程环境中调用
}
}
分析原因:
当多个线程并发调用 buf.put(A.getData())时,由于执行buf.put(A.getData())会修改class A中的buf的当前位置(position),所以在高并发的情况下,class A中的buf的位置(position)在哪会很难预料。
解决办法也有,比如在class B中的 buf.put(A.getData()) 前加同步锁(synchronized),但这样以来,反而有可能会失性能下降。
后来想一想,又为何要用ByteBuffer改写byte[]呢?直接用byte[],buf.put(A.getData())不是也很方便吗?
2012-07-05