java map存储对象_java-在ConcurrentHashMap中存储复杂对象
根据实践中的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中存储复杂对象相关推荐
- java memcached 存储对象_java – 从Memcache中获取低级别数据存储区实体对象时的慢速反序列化...
事实证明,检索存储内存缓存的低级数据存储实体非常缓慢.由于objectify将实体缓存为低级数据存储区实体类型,因此当使用objectify从memcache中获取许多实体时,这会导致性能不佳. 真正 ...
- java map 自动排序_Java中Map的排序
Map的种类 在Java中,Map的主要作用是存储键值对.由于是根据键得到值,所以不允许键重复.它主要有如下几个类别: HashMap: 最常用的Map,它根据键的HashCode值存储数据,根据键可 ...
- java map 允许重复_java中key值可以重复的map:IdentityHashMap
在Java中,有一种key值可以重复的map,就是IdentityHashMap.在IdentityHashMap中,判断两个键值k1和 k2相等的条件是 k1 == k2 .在正常的Map 实现(如 ...
- java map传入参数_JAVA中map中参数的添加修改
Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象. Map的接口 Map---实现Map Map.Entry--Map的内部类,描述Map中的按键/数值对. S ...
- java map 自动排序_java Map排序问题
java 中,Map常见的有HashMap ,TreeMap等等,Map是一个接口,我们不能直接声明一个Map类型的对象,在实际开发 中,比较常用的Map性数据结构是HashMap和TreeMap,它 ...
- android java 实体类 object变量 保存_Android中Intent传递对象的两种方法Serializable,Parcelable...
Android中的传递有两个方法,一个是Serializable,另一个是Parcelable. Serializable是J2SE本身就支持的.而Parcelable是Android所特有的. 二者 ...
- java语言sql接口_java.sql包中的类和接口及其使用
java.sql包提供使用Java编程语言访问并处理存储在数据源中数据的API,可以动态地安装不同驱动程序来访问不同数据源. 下面,详解java.sql包中包含的常用的接口和类 1.DriverMan ...
- java jpa更新数据_Java如何使用JPA更新实体对象?
在此示例中,您将学习如何在JPA中更新实体对象.我们使用该EntityManager.merge()方法来更新实体.此方法将要保存的实体作为参数,然后将合并的实体作为结果返回. 您可以在下面的代码片段 ...
- java 由接口构造对象_Java学习笔记04——类和对象|抽象和接口|构造方法与继承...
六.Java类 1. Java中用关键字class来创建类. 2. 类中属性和方法称为类的成员;类的声明和方法要在同一个文件内,不同于C++. 3. 类的定义: [] class [extend ...
- html 属性存储对象,在HTML5 localStorage中存储对象
Stringify并不能解决所有问题 似乎这里的答案并未涵盖JavaScript中可能的所有类型,因此这里有一些关于如何正确处理它们的简短示例://Objects and Arrays: var ob ...
最新文章
- 自己写的程序发给别人老是会出现缺失各种库,而自己电脑运行却没毛病
- 中国楼市场的真相————写在厦门楼市崩盘之后
- 从netty-example分析Netty组件续
- oracle进城有哪些,oracle主要进程详解
- NXP(I.MX6uLL) UART串口通信原理————这个未复习
- 【升级版】如何使用阿里云云解析API实现动态域名解析,搭建私有服务器【含可执行文件和源码】...
- web文件管理系统_财务影像管理系统
- domino代理通过Request_Content域接收extjs以post方式提交的数据
- Jmeter工作原理
- android 富文本编辑器_富文本编辑器,还是Tinymce好一点?Angular/Vue集成最新版
- 算法洗脑系列(8篇)——第八篇 概率思想
- Frame帧动画帧布局Android
- 线上python课程一般多少钱-学习Python这门课程大概需要多久?费用是多少?
- 刘国辉 :做银行背后的“卖水人”,是不是好生意?
- ddtek.oracle.dll使用相关
- Navicat Premiumx64 使用注册机激活
- 高等数学 · 第一章 函数
- Ubuntu下软件包的清理与删除
- 考研丨7-12月复习安排时间表
- 什么是剩余参数 ...arg
热门文章
- 对话行癫:解密阿里云顶层设计和底层逻辑 1
- contiki学习笔记(十二)UIPTCP/IP协议
- 关系型数据库设计原则
- PE格式之DOS头+PE头
- 使用Google colab的GPU运行resnet
- 微信老外产品经理:《中国移动应用设计趋势》
- WordPress 5文章编辑真难用 换回老版经典编辑器教程
- 算法分析:大O符号/大Ω符号/大Θ符号/小o符号/小w符号
- spyder/conda安装包报错:conda info could not be constructed. KeyError: ‘pkgs_dirs‘
- laravel 中 使用闭包查询 分开whereIn