首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java mmap MappedByteBuffer

Java mmap MappedByteBuffer
EN

Stack Overflow用户
提问于 2021-09-16 11:24:32
回答 1查看 138关注 0票数 0

假设我已经映射了一个内存区域0,1000,现在我有了MappedByteBuffer。

我是否可以同时从多个线程读取和写入该缓冲区,而不需要锁定,前提是每个线程为exp访问缓冲区的不同部分。T1 [0,500],T2 500,1000

如果上述情况属实,是否可以确定是否最好为多个线程创建一个大缓冲区,还是为每个线程创建一个更小的缓冲区?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-16 12:32:50

详细介绍:

如果您想自己学习如何回答这些问题,请检查它们的实现源代码:

现在它变得更复杂了:

当您想要分配一个MappedByteBuffer时,您将得到一个

您也可以下载Java版本的源代码包,并将它们附加到IDE中,这样您就可以看到开发和调试模式中的代码,而不必浏览internet页面。容易多了。

简短(不完整)答复:

它们都不能安全地防止多线程。

因此,如果您需要调整

  • 的大小,那么如果大小为常数,您可能会变得陈旧,甚至是糟糕的(ArrayIndexOutOfBoundsException)访问
  • ,您可以依靠这两种实现来实现“线程安全”,就您的需求而言--

附带说明,这里还存在一个实现故障爬行在实现:

  • MappedByteBuffer扩展ByteBuffer
  • ByteBuffer有堆byte[]称为"hb"
  • DirectByteBuffer扩展MappedByteBuffer扩展ByteBuffer
  • So DirectByteBuffer还有ByteBuffer的byte[] hb缓冲区,
    • but不使用it

    • and反而创建和管理自己的Buffer

这个设计缺陷来自于这些类的逐步开发(它们并不是同时规划和实现的),以及包可见性的主题,导致了对实现的依赖性/层次结构的倒置。

现在是真正的答案:

如果你想做正确的面向对象的编程,你不应该共享资源,除非完全需要。这尤其意味着每个线程都应该有自己的缓冲区。

拥有一个全局缓冲区的优势:唯一的“优势”是减少额外对象引用的额外内存消耗。但是这种影响是的,所以最小的(甚至是应用程序内存消耗的1:10000的变化),你永远不会注意到它。有那么多其他对象被分配给任意数量的奇怪(Java)原因,所以这是您最不关心的问题。此外,您还需要引入更多的数据(索引边界),这会减少更多的“优势”。

拥有单独缓冲区的最大优势:

当您在任何给定的arithmetics

  • especially上需要更多的线程时,您将不必处理指针/索引time

您可以在任何时候自由地分配新线程,而不必重新排列任何数据或执行更多指针,arithmetics

  • you可以在需要时自由地重新分配/调整每个单个缓冲区的大小(无需担心所有其他线程的索引requirement)

  • Debugging:,您就可以找到“越界写入”导致的问题,因为如果它们尝试,坏线程就会崩溃,而其他必须处理损坏的data

  • Java的线程在访问它之前总是检查每个数组访问(在普通堆数组上,比如byte[]),准确地防止侧effects

    • think返回:很久以前,操作系统在引入线性地址空间方面迈出了很大的一步,所以程序不必关心硬件内存中它们是loaded.

的位置

    • Your单缓冲区设计将是backwards.

的确切步骤。

结论:

如果你想有一个非常糟糕的设计选择--这将使以后的生活变得更加艰难--你需要一个全局缓冲器。

如果你想用正确的OO方式去做,就把那些缓冲区分开。没有复杂的依赖关系和副作用问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69207557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档