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

 

posted @ 2015-06-17 14:44  personnel  阅读(2187)  评论(0编辑  收藏  举报
友情链接:图片批量处理工具 gif动态图制作工具 制作电子相册 图片排版工具 制作淘宝主图视频 MKScript 鼠标键盘自动化脚本语言