java 直接int buffer的put()的绝对版本需要同步吗?

8ftvxx2r  于 5个月前  发布在  Java
关注(0)|答案(1)|浏览(45)

我有一个直接缓冲区的使用,其中直接缓冲区是分配和使用如下:

ByteBuffer buffer = ByteBuffer.allocateDirect(8192);
IntBuffer buffer1 = buffer.asIntBuffer();
buffer1.limit(1024);
buffer.position(4096);
IntBuffer buffer2 = buffer.asIntBuffer();

字符串
那么buffer 1和buffer 2都可以从多个线程中使用绝对get和put。在这种情况下,似乎文档中没有指定读取和写入是原子的(与写入和阅读常规java数组相同,忽略可见性),即使我可以从底层实现中告诉它。
在这个用例中,如果它是一个普通的java数组,我不需要任何额外的同步来访问它,因为其他现有的同步将保证happens-before关系。就我所知,严格按照文档,对于直接缓冲区,我似乎需要同步对这些缓冲区的访问。我是否错过了允许我跳过同步的东西?

57hvy0tb

57hvy0tb1#

Buffer包含关于线程安全性的声明:

线程安全

多个并发线程使用缓冲区是不安全的。如果一个缓冲区要由多个线程使用,那么对缓冲区的访问应该由适当的同步控制。
Buffer的子类中没有包含任何关于线程安全的附加语句,因此必须假定此语句也适用于直接缓冲区及其变量。

相关问题