zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    顶点与片段着色器的例子
    Unity cg vertex and fragment shaders(二)
    Unity cg vertex and fragment shaders(一)
    C#线程(一)
    shell脚本变量定义注意别跟系统变量重名了……
    VLC编译问题
    VIM技巧:翻页
    Linux命令:cd
    Linux设置:环境变量
    VIM技巧:显示行号
  • 原文地址:https://www.cnblogs.com/personnel/p/4583289.html
Copyright © 2011-2022 走看看