synchronized不仅仅用于实现原子性或者确定“临界性”,还用于"内存可见性"。
内存可见性可以通过显式同步或类库中内置同步实现。
1可见性
重排序会导致输出0
也可能因为可见性ready一直读不到true,无限循环
1.1失效数据
1.2非原子64位操作
- 最低安全性:
- 例外:非volatile类型64位变量(double,long)
1.3加锁与可见性
1.4volatile变量
优点:避免加锁,开销低
缺点:可见性比加锁弱(待补充),难理解,不保证原子性
2.对象发布与逸出
解释:
Java中,内部类对象持有指向外部类对象的引用。
所以在构造函数中使用内部类导致this逸出。
2.1this逸出
- 除了上述在构造函数中使用内部类导致this逸出外,在构造函数中使用启动线程也会导致this逸出。
- 解决方案:
3.线程封闭