根据实践中的Java Concurrency,以下代码可能引发断言错误:

如果要调用发布线程以外的线程

assertSanity,它可能会引发AssertionError

public class Holder {

private int n;

public Holder(int n) { this.n = n; }

public void assertSanity() {

if (n != n)

throw new AssertionError("This statement is false.");

}

}

// Unsafe publication

public Holder holder;

public void initialize() {

holder = new Holder(42);

}

问题是:如果我保存一个引用ConcurrentHashMap中其他对象的对象,则由于与上述示例相同的原因,在多线程环境中,该对象图上的某些更新可能不会同步?

虽然对象图中的根节点将始终在映射中针对所有线程进行更新,但是如果其他对象不是final或volatile,那么在根节点中称为字段的其他对象又如何呢?

解决方法:

在回答我自己的问题之前,我应该先完整阅读一章,然后再提出问题.这是本章后面的内容:

Mutable objects: If an object may be modified after construction, safe

publication ensures only the visibility of the as-published state.

Synchronization must be used not only to publish a mutable object, but

also every time the object is accessed to ensure visibility of

subsequent modifications. To share mutable objects safely, they must

be safely published and be either thread-safe or guarded by a lock.

因此,在多线程环境中使用CHM或任何线程安全集合都是不安全的,除非您将更改同步到CHM中的可变对象,或者这些对象是不可变的.

标签:multithreading,concurrency,java

来源: https://codeday.me/bug/20191119/2035130.html

java map存储对象_java-在ConcurrentHashMap中存储复杂对象相关推荐

  1. java memcached 存储对象_java – 从Memcache中获取低级别数据存储区实体对象时的慢速反序列化...

    事实证明,检索存储内存缓存的低级数据存储实体非常缓慢.由于objectify将实体缓存为低级数据存储区实体类型,因此当使用objectify从memcache中获取许多实体时,这会导致性能不佳. 真正 ...

  2. java map 自动排序_Java中Map的排序

    Map的种类 在Java中,Map的主要作用是存储键值对.由于是根据键得到值,所以不允许键重复.它主要有如下几个类别: HashMap: 最常用的Map,它根据键的HashCode值存储数据,根据键可 ...

  3. java map 允许重复_java中key值可以重复的map:IdentityHashMap

    在Java中,有一种key值可以重复的map,就是IdentityHashMap.在IdentityHashMap中,判断两个键值k1和 k2相等的条件是 k1 == k2 .在正常的Map 实现(如 ...

  4. java map传入参数_JAVA中map中参数的添加修改

    Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象. Map的接口 Map---实现Map Map.Entry--Map的内部类,描述Map中的按键/数值对. S ...

  5. java map 自动排序_java Map排序问题

    java 中,Map常见的有HashMap ,TreeMap等等,Map是一个接口,我们不能直接声明一个Map类型的对象,在实际开发 中,比较常用的Map性数据结构是HashMap和TreeMap,它 ...

  6. android java 实体类 object变量 保存_Android中Intent传递对象的两种方法Serializable,Parcelable...

    Android中的传递有两个方法,一个是Serializable,另一个是Parcelable. Serializable是J2SE本身就支持的.而Parcelable是Android所特有的. 二者 ...

  7. java语言sql接口_java.sql包中的类和接口及其使用

    java.sql包提供使用Java编程语言访问并处理存储在数据源中数据的API,可以动态地安装不同驱动程序来访问不同数据源. 下面,详解java.sql包中包含的常用的接口和类 1.DriverMan ...

  8. java jpa更新数据_Java如何使用JPA更新实体对象?

    在此示例中,您将学习如何在JPA中更新实体对象.我们使用该EntityManager.merge()方法来更新实体.此方法将要保存的实体作为参数,然后将合并的实体作为结果返回. 您可以在下面的代码片段 ...

  9. java 由接口构造对象_Java学习笔记04——类和对象|抽象和接口|构造方法与继承...

    六.Java类 1.  Java中用关键字class来创建类. 2.  类中属性和方法称为类的成员;类的声明和方法要在同一个文件内,不同于C++. 3.  类的定义: [] class [extend ...

  10. html 属性存储对象,在HTML5 localStorage中存储对象

    Stringify并不能解决所有问题 似乎这里的答案并未涵盖JavaScript中可能的所有类型,因此这里有一些关于如何正确处理它们的简短示例://Objects and Arrays: var ob ...

最新文章

  1. 自己写的程序发给别人老是会出现缺失各种库,而自己电脑运行却没毛病
  2. 中国楼市场的真相————写在厦门楼市崩盘之后
  3. 从netty-example分析Netty组件续
  4. oracle进城有哪些,oracle主要进程详解
  5. NXP(I.MX6uLL) UART串口通信原理————这个未复习
  6. 【升级版】如何使用阿里云云解析API实现动态域名解析,搭建私有服务器【含可执行文件和源码】...
  7. web文件管理系统_财务影像管理系统
  8. domino代理通过Request_Content域接收extjs以post方式提交的数据
  9. Jmeter工作原理
  10. android 富文本编辑器_富文本编辑器,还是Tinymce好一点?Angular/Vue集成最新版
  11. 算法洗脑系列(8篇)——第八篇 概率思想
  12. Frame帧动画帧布局Android
  13. 线上python课程一般多少钱-学习Python这门课程大概需要多久?费用是多少?
  14. 刘国辉 :做银行背后的“卖水人”,是不是好生意?
  15. ddtek.oracle.dll使用相关
  16. Navicat Premiumx64 使用注册机激活
  17. 高等数学 · 第一章 函数
  18. Ubuntu下软件包的清理与删除
  19. 考研丨7-12月复习安排时间表
  20. 什么是剩余参数 ...arg

热门文章

  1. 对话行癫:解密阿里云顶层设计和底层逻辑 1
  2. contiki学习笔记(十二)UIPTCP/IP协议
  3. 关系型数据库设计原则
  4. PE格式之DOS头+PE头
  5. 使用Google colab的GPU运行resnet
  6. 微信老外产品经理:《中国移动应用设计趋势》
  7. WordPress 5文章编辑真难用 换回老版经典编辑器教程
  8. 算法分析:大O符号/大Ω符号/大Θ符号/小o符号/小w符号
  9. spyder/conda安装包报错:conda info could not be constructed. KeyError: ‘pkgs_dirs‘
  10. laravel 中 使用闭包查询 分开whereIn