gpt4 book ai didi

java - 为什么从 ByteBuffer 的绝对读取不被认为是线程安全的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:38:06 26 4
gpt4 key购买 nike

我的用例需要一个直接分配的 ByteBuffer写入一次,然后由许多并发线程读取。所有读取都是绝对的,所以我从不关心缓冲区的状态(位置、限制、标记)。

This article Keith Gregory 在字节缓冲区上警告说,即使是绝对读取也不被认为是线程安全的:

ByteBuffer thread safety is covered in the Buffer JavaDoc; the short version is that buffers are not thread-safe. Clearly, you can't use relative positioning from multiple threads without a race condition, but even absolute positioning is not guaranteed (regardless of what you might think after looking at the implementation classes).

(强调我的)

因为这个警告,我在每次从字节缓冲区读取之前调用 duplicate .这很简单,但每次读取时额外的对象分配让我很好奇为什么它实际上是必要的。

尽管 Keith 的声明非常巧妙,但我确实查看了 OpenJDK 的 implementation从直接字节缓冲区的绝对读取:

public byte get(int i) {
return ((unsafe.getByte(ix(checkIndex(i)))));
}

你可以看到它只是委托(delegate)给了Unsafe.getByte(long)。 ,它“从给定的内存地址中获取一个值”。

我知道可能存在不同的实现,但是这个操作有什么理由不能是线程安全的呢? Buffer 契约是否只是拒绝保证绝对读取的线程安全,以避免部分线程安全类的混淆?或者,如果警告对于并发写入是合理的,那么我的情况呢,即字节缓冲区在创建后未被修改?此外,使用 MappedByteBuffer 时会有什么变化吗?相反?

相关:

最佳答案

Buffer 文档指出对缓冲区的访问应该是同步的。它并没有说它不能被不同的线程使用。所以我认为不需要 duplicate

你想不出某个方法或其他方法的合理非线程安全实现更多的是你想象力的限制而不是证明没有必要谨慎。特别是考虑到您没有查看 Oracle Java 代码,而 Oracle 声明该实现不是线程安全的。

我的建议:在访问缓冲区时做一些合理的同步。即使永远不会有非线程安全的实现,您也不会花费太多。

关于java - 为什么从 ByteBuffer 的绝对读取不被认为是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26728743/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com