可见性
对象引用的可见性与对象域可见性不同???
锁在保证原子性的同时保证了可见性
原子性通过引入不可分割的语义,保证了自身的执行的正确性,通过状态集不被其他线程修改。
可见性:自身的执行对状态的修改可能影响其他线程的约束。修改——可见存在延迟,可见性去除了其中的延迟。
提供可见性的状态维护了这组状态的一致快照
volatile提供可见性,但只针对原子性的读写操作
实现上不使用锁,线程不会阻塞
常用作状态标志
非复合:读写不可依赖于变量;不与其他变量构成约束(从而相关);访问变量时不需要加锁???双重可见性冗余了?
发布:可访问其引用
公共静态变量、非私有域、内部类发布外部类
安全的对象构造:当且仅当构造函数返回时,对象处于可预测的一致状态。构造过程中this引用不可逸出
线程封闭:
局部变量、ThreadLocal
//单个线程修改volatile变量
局部变量:基本类型:封闭;引用:须保证不逸出
ThreadLocal:每个线程保存变量的独立副本:如事务上下文
不变对象:
正确创建:不逸出
所有域final:确保初始化安全
不修改状态
//由volatile变量+引用不可变+引用可变变量提供弱原子性
以上将对象封闭在线程或对象内部,保证不发布
安全发布