我使用了直接缓冲区,其中直接缓冲区的分配和使用如下:
ByteBuffer buffer = ByteBuffer.allocateDirect(8192);
IntBuffer buffer1 = buffer.asIntBuffer();
buffer1.limit(1024);
buffer.position(4096);
IntBuffer buffer2 = buffer.asIntBuffer();
然后 buffer1 和 buffer2 都可以通过绝对 get 和 put 从多个线程中使用。在这种情况下,文档中似乎没有任何内容指定读取和写入将是原子的(与写入和读取常规 java 数组的意义相同,忽略可见性),尽管据我从底层实现中可以看出将会是。
在这个用例中,如果它是一个常规的java数组,我不需要任何额外的同步来访问它,因为其他现有的同步将保证发生之前的关系。对于直接缓冲区,据我所知,严格按照文档,似乎我需要同步对这些缓冲区的访问。我是否缺少一些可以让我跳过同步的东西?
Buffer
包含以下有关线程安全的声明:
线程安全
缓冲区对于多个并发线程使用并不安全。如果缓冲区要由多个线程使用,则应通过适当的同步来控制对缓冲区的访问。
Buffer
的子类不包含任何有关线程安全的附加语句,因此您必须假设该语句也适用于直接缓冲区及其变体。