【发布时间】:2012-06-24 14:21:21
【问题描述】:
我有哪些选项可以使 ByteBuffer 线程安全?众所周知,它不是线程安全的,因为它保护位置、限制和一些(/全部?)方法取决于这个内部状态。
就我的目的而言,如果多个读取线程是安全的就足够了,但对于其他未来的访问者,我想知道我需要知道哪些技术/技巧/陷阱才能使其完全线程安全。
我的想法:
- 为所有方法同步或使用读写锁。可能是最慢的方法 (?)
- 子类化 ByteBuffer 并避免持久化线程绑定状态,如位置等。并为所有需要使用内部状态的方法相应地抛出异常。这将是禁食。但是有什么陷阱吗? (除了我必须将直接映射的内存读入堆内存......)
我还可以使用哪些其他技巧?我会怎么做?使用 DirectBuffer 实现“读取时克隆字节” - 有可能吗?可能会在一个解决方案中涉及对完整的 ByteBuffer (ByteBuffer.slice) 进行切片吗?
更新:question 中的含义 “复制(同步时)以获取指向相同映射字节的新实例”
【问题讨论】:
-
我更喜欢使用一个参与者模型,其中任何 ByteBuffer 仅由一个线程更新(或只读)。我这样做的原因是我发现同步的开销通常超过了拥有多个线程的好处。
-
谢谢,彼得!你是通过切片使用这个吗?或者您如何访问相同的数据?
-
我不使用切片,而是使用隐藏所有内容的包装器(即使我正在使用 ByteBuffers 并且我可能想要切换到更快的 Unsafe)包装器是您可以隐藏所有细节并通过调用方法自然地访问您的“数组”。这特别有用,因为我有包含数十亿个元素的数组,这些元素不适合单个 ByteBuffer。
-
我运气好,而你的缓冲区包装器是开源的;)?
-
不,但我有一个类似的开源库。 github.com/peter-lawrey/Java-Chronicle 这是基于条目/行/摘录而不是基于列,但技术是相同的。
标签: java thread-safety bytebuffer