当前位置: 首页 > 知识库问答 >
问题:

为什么Java没有像AtomicReferenceArray那样使用VarHandle作为集合类?

宗政功
2023-03-14

通过在 Java 中使用 VarHandle 类,您可以实现对对象的原子操作,通过这些操作,像 AtomicReferenceArray 这样的类可以对数组的元素执行并发操作,而无需锁定(同步)整个数组结构,从而显著提高性能。

集合的其他同步和线程安全版本没有实现此类模型是否有任何特定原因?
例如,Collections 类中的所有同步工厂方法都返回其相应集合的版本,该版本使用锁定整个集合的同步方法!

共有1个答案

黄隐水
2023-03-14

对对象的原子操作不一定使整个集合具有线程安全性。例如,集合中的同步工厂方法是使任意集合实现线程安全的唯一方法。

有可能使用< code>VarHandle来优化专门为并发性构建的集合,例如< code>ConcurrentHashMap。如果您认为< code>VarHandle可以用来改进这些类型,您应该提交一个功能请求。完全有可能只是没人费心去做。

 类似资料:
  • 和都有构造函数来设置初始容量,但提供以确保如果预期插入大量元素,内部数组已经增加。在某些情况下,也可能发生同样的事情。那么为什么没有确保容量的方法来保持存储桶准备就绪?

  • 注意:我不一定要寻找下面描述的具体示例问题的解决方案。我真的很感兴趣,为什么这在java 8中是不可能的。 Java流是懒惰的。最后,他们有一个单一的终端操作<我的解释是,这个终端操作将通过流提取所有值。没有任何中间操作可以做到这一点。为什么没有中间操作通过流拉入任意数量的元素?类似这样: 当下游操作尝试推进流一次时,中间操作可能尝试多次(或根本不推进)上游。 我会看到几个用例: (这些只是示例。

  • 问题内容: 我已经阅读了每个原始数据类型和对象引用通过值传递的地方吗? 我曾尝试在Google中搜索为什么Java不支持按引用传递,但 我只得到Java不支持按引用传递, 而且 我找不到背后的任何原因 。 为什么不能通过引用传递原始数据类型? 编辑: 假定它是主观和争论的,大多数人都关闭了我的问题。 好吧,不是,它有一个明确的答案,我的问题就像你为什么不能创建抽象类的对象,并且它也不是重复的,因为

  • 问题内容: 我见过的几乎每个Java项目都使用Maven或Ant。它们是很好的工具,我认为几乎任何项目都可以使用它们。但是,什么都发生在使?它用于各种非Java项目,并且可以轻松处理Java。当然,如果使用Windows,则必须下载make.exe,但JDK并不随附Ant和Maven。 与Java一起使用时,make是否存在一些基本缺陷?仅仅是因为Ant和Maven是用Java编写的吗? 问题答案

  • 问题内容: 我想知道为什么没有像这样的Locale参数。 我必须首先将任何语言的文本大写。我有2个解决方案: 用 用 对于我的语言环境。两种方式具有相同的结果。 我的问题是: 由于文本可以是任何语言。我应该使用哪种方式? 为什么没有Locale参数,因为String 之间没有太多区别,并且String是字符数组。 问题答案: 在Javadoc中, 通常,应将字符映射为大写。案例映射方法比案例映射方

  • 问题内容: 这些变量分配按预期工作: 但是,这些分配的行为不同: 为什么与示例不同,为什么相同?我如何在类示例中做类似的事情?也就是说,复制对象,然后更改它的一部分(那不会影响我借用属性的对象)吗? 问题答案: 我没有看到有人通过复制对象而不是仅仅为同一对象分配新的引用来提供有关如何使这两种情况相同的详细信息。 这将为您提供: