假设我已经映射了一个内存区域0,1000,现在我有了MappedByteBuffer。
我是否可以同时从多个线程读取和写入该缓冲区,而不需要锁定,前提是每个线程为exp访问缓冲区的不同部分。T1 [0,500],T2 500,1000
如果上述情况属实,是否可以确定是否最好为多个线程创建一个大缓冲区,还是为每个线程创建一个更小的缓冲区?
发布于 2021-09-16 12:32:50
详细介绍:
如果您想自己学习如何回答这些问题,请检查它们的实现源代码:
现在它变得更复杂了:
当您想要分配一个MappedByteBuffer时,您将得到一个
您也可以下载Java版本的源代码包,并将它们附加到IDE中,这样您就可以看到开发和调试模式中的代码,而不必浏览internet页面。容易多了。
简短(不完整)答复:
它们都不能安全地防止多线程。
因此,如果您需要调整
。
附带说明,这里还存在一个实现故障爬行在实现:
byte[]称为"hb"byte[] hb缓冲区,。
这个设计缺陷来自于这些类的逐步开发(它们并不是同时规划和实现的),以及包可见性的主题,导致了对实现的依赖性/层次结构的倒置。
现在是真正的答案:
如果你想做正确的面向对象的编程,你不应该共享资源,除非完全需要。这尤其意味着每个线程都应该有自己的缓冲区。
拥有一个全局缓冲区的优势:唯一的“优势”是减少额外对象引用的额外内存消耗。但是这种影响是的,所以最小的(甚至是应用程序内存消耗的1:10000的变化),你永远不会注意到它。有那么多其他对象被分配给任意数量的奇怪(Java)原因,所以这是您最不关心的问题。此外,您还需要引入更多的数据(索引边界),这会减少更多的“优势”。
拥有单独缓冲区的最大优势:
当您在任何给定的arithmetics
您可以在任何时候自由地分配新线程,而不必重新排列任何数据或执行更多指针,arithmetics
byte[]),准确地防止侧effects的位置
的确切步骤。
结论:
如果你想有一个非常糟糕的设计选择--这将使以后的生活变得更加艰难--你需要一个全局缓冲器。
如果你想用正确的OO方式去做,就把那些缓冲区分开。没有复杂的依赖关系和副作用问题。
https://stackoverflow.com/questions/69207557
复制相似问题