假设我已经映射了一个内存区域 [0, 1000],现在我有了 MappedByteBuffer。
假设每个线程为 exp 访问缓冲区的不同部分,我是否可以同时从多个线程读取和写入此缓冲区而无需锁定。T1 [0, 500), T2 [500, 1000]?
如果上述情况属实,是否可以确定是为多个线程创建一个大缓冲区,还是为每个线程创建一个较小的缓冲区?
假设我已经映射了一个内存区域 [0, 1000],现在我有了 MappedByteBuffer。
假设每个线程为 exp 访问缓冲区的不同部分,我是否可以同时从多个线程读取和写入此缓冲区而无需锁定。T1 [0, 500), T2 [500, 1000]?
如果上述情况属实,是否可以确定是为多个线程创建一个大缓冲区,还是为每个线程创建一个较小的缓冲区?
如果您想学习如何自己回答这些问题,请查看它们的实现源代码:
现在它变得有点复杂:
当你想分配一个 MappedByteBuffer 时,你会得到一个
不必浏览互联网页面,您还可以简单地下载 Java 版本的源代码包并将它们附加到您的 IDE 中,这样您就可以在开发和调试模式下查看代码。轻松很多。
它们都不能防止多线程。
附带说明一下,Java 实现中还有一个实现失败的蔓延:
byte[]
叫做“hb”的堆byte[] hb
缓冲区,这个设计缺陷来自于这些类的逐步开发(它们不是同时计划和实现的),以及包可见性的主题,导致实现的依赖/层次结构的反转。
如果你想做正确的面向对象编程,除非绝对需要,否则不应该共享资源。这特别意味着每个线程都应该有自己的缓冲区。
拥有一个全局缓冲区的优势:唯一的“优势”是减少额外对象引用的额外内存消耗。但是这种影响非常小(甚至不会在您的应用程序 RAM 消耗中发生 1:10000 的变化),以至于您永远不会注意到它。由于各种奇怪的(Java)原因,到处都有许多其他对象被分配,这是您最不关心的问题。另外,您将不得不引入额外的数据(索引边界),这会进一步降低“优势”。
拥有单独缓冲区的最大优势:
byte[]
),以防止副作用如果你想要一个非常糟糕的设计选择——这会让以后的生活变得更加艰难——你可以选择一个全局 Buffer。
如果您想以正确的 OO 方式进行操作,请将这些缓冲区分开。没有复杂的依赖和副作用问题。