第三章 对象的共享
可见性
失效数据
非原子的64位操作:非volatile类型的64位数值变量(double和long).java内存模型要求,变量的读取和写入操作必须是原子。对于非volatile类型的long和double变量,JVM允许将64位的读写操作分解成两个32位操作
加锁与可见性
Volatile变量:只能保证可见性,原子性不能
发布与逸出
发布:一个对象能够在当前作用域之外的代码使用
逸出:某个对象不应该发布的时候被发布出去,不要在构造过程中使thsi引用逸出
线程封闭
当访问共享的可变数据时,通常需要使用同步,一种避免使用同步的方式就是不共享数据。仅在单线程内访问数据,就不需要同步
Ad-hoc线程封闭
栈封闭
Threadlocal类
不变性
不可变对象一定是线程安全的
满足以下条件对象才是不可变的:
对象创建以后其状态就不能修改
对象所有域都是final类型
对象是正确创建的(在对象创建期间,this引用没有逸出)
安全发布
在静态初始化函数中初始化一个对象引用
将对象的引用保存到volatile类型的域或者AtomicReferance对象中
将对象的引用保存到某个正确构造对象的final类型域中
将对象的引用保存到一个由锁保护的域中
不积跬步,无以至千里;不积小流,无以成江海