1.对象安全发布的几种方式
安全发布一个对象,对象的引用和对象的状态,必须是对其他对象可见的。
下面是对象可以安全发布的几种方式
- 在静态函数中初始化一个对象
- 将对象保存到 volatile 或者 atomicReferance对象中
- 将对象的引用保存到 某个正确构造对象的 final 类型域中国。
- 将对象引用保存到一个由锁保护的域中。
线程安全容器的同步,指的是 将对象放入到某个容器 即:(将对象引用保存到一个由锁保护的域中)
- 例如 vector ,synchronizedList 中。 如果线程A 将对象X放入到 一个线程安全的容器中,随候线程B读取这个对象,那么可以确保B 看到线程A 设置X的状态,即便 这块读/写 X应用程序代码没有包含在显示的同步。
2. 线程安容器
后续补充
3.使用静态初始化器 发布安全对象
通常 发布一个静态构造对象 ,是最简单和最安全的方式,是使用静态初始化器。
下面展示一些内联代码片
。
public static Holder holder = new Holder(42);
静态初始化器由jvm 在类的初始化阶段执行。由于jvm 内部的同步机制,因此通过这种方式 初始化任何对象 都可以被安全的发布。
4. 扩展
4.1 名词解释
- 安全发布
- 安全性失败
- 活性失败
4.2 互斥的理解
互斥:当一个对象被一个线程修改的时候,可以阻止另一个线程观察到对象内部的不一致的状态。可以理解为,对象被创建的时候处于一致的状态,当有方法访问它的时候,它就被锁定了。这些方法观察到对象的状态,并且可能会引起状态转变,即把对象从一个状态转换到另一种状态。正确的使用同步可以保证没有任何方法会看到对象处于不一致的状态。
4.3 同步的理解
1.同步 对进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护的之前所有的修改结果。
2.阻止没有进入的到同步方法或者代码块的线程,看到对象处于不一致的状态。
3.同步归功于 java内容模型,它规定了一个线程所做的变化何时以及如何变成,对其他线程可见。
4.4 安全发布
- 1.将它保存在静态域中。
- 2.作为类初始化的一部分。
- 3.可以保存在volatile,final。
- 4.者通过正常锁定访问的域中。
- 5.将它放在并发集合中。
总结:
- 只有共享的数据(全局指的是 工具类,或者是全局缓存类,工具类中的成员变量,使用日期转化SimpleDateFormat ),需要考虑线程安全问题。
项目中的DTO 代码中的 非全局共享的,使用的对象用不到 线程安全,也不用考虑线程安全问题,调用过程中,每次都会创建对象。
- 参考:
- 《effective java》
- 《java并发编程的艺术》