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

原文地址:https://www.cnblogs.com/personnel/p/4583289.html