直接 int 缓冲区的 put() 的绝对版本是否需要同步?

问题描述 投票:0回答:1

我使用了直接缓冲区,其中直接缓冲区的分配和使用如下:

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数组,我不需要任何额外的同步来访问它,因为其他现有的同步将保证发生之前的关系。对于直接缓冲区,据我所知,严格按照文档,似乎我需要同步对这些缓冲区的访问。我是否缺少一些可以让我跳过同步的东西?

java thread-safety direct-buffer
1个回答
0
投票

Buffer
包含以下有关线程安全的声明:

线程安全

缓冲区对于多个并发线程使用并不安全。如果缓冲区要由多个线程使用,则应通过适当的同步来控制对缓冲区的访问。

Buffer
的子类不包含任何有关线程安全的附加语句,因此您必须假设该语句也适用于直接缓冲区及其变体。

© www.soinside.com 2019 - 2024. All rights reserved.