同步的作用
- 1、确保以原子的方式执行操作:防止读取正在被修改的状态变量
- 2、 内存可见性:确保一个线程修改了对象状态后,其他线程可以看到
** 可以通过使用【同步】或是类库中内置的同步来保证对象被安全的发布**
3.1 可见性
失效数据
非原子的64位操作
加锁与可见性:所有执行读操作或是写操作的线程都必须在同一个锁上同步
volatile
发布与逸出
- 发布(publish)是一个对象可以在当前作用域之外的地方被引用到
- 逸出(Escape)当某个不该被发布的对象被发布时,称为逸出
- 发布一个对象时,对象内部非私有域中引用的所有对象都会被发布
- 当把一个对象传给外部方法时,这个对象已经被发布
- 发布一个内部类的时候,这个类本身也被发布
- 不要再构造过程中使得this引用逸出
线程封闭
- 线程封闭(Thread Confinement):如果只在单线程内访问数据,就不需要同步
- 常见的线程封闭对象:1、JDBC 中的connection对象;2、java中的局部变量;3、java中的ThreadLocal变量
不变性
- 满足同步需求的另外一个做法是使用不可变对象(Im'mutable Object)
- 不可变对象一定是线程安全的