synchronized不仅仅用于实现原子性或者确定“临界性”,还用于"内存可见性"。

内存可见性可以通过显式同步或类库中内置同步实现。

1可见性

3.对象的共享

3.对象的共享

重排序会导致输出0

也可能因为可见性ready一直读不到true,无限循环

1.1失效数据

1.2非原子64位操作

  • 最低安全性:3.对象的共享
  • 例外:非volatile类型64位变量(double,long)

3.对象的共享

1.3加锁与可见性

3.对象的共享

3.对象的共享

1.4volatile变量

3.对象的共享

3.对象的共享

优点:避免加锁,开销低

缺点:可见性比加锁弱(待补充),难理解,不保证原子性

  • 3.对象的共享
  • 3.对象的共享
  • 3.对象的共享

 

2.对象发布与逸出

3.对象的共享

 

3.对象的共享

解释:

Java中,内部类对象持有指向外部类对象的引用。

所以在构造函数中使用内部类导致this逸出。

2.1this逸出

3.对象的共享

  • 除了上述在构造函数中使用内部类导致this逸出外,在构造函数中使用启动线程也会导致this逸出。

3.对象的共享

  • 解决方案:

3.对象的共享

 

3.线程封闭

 

 

相关文章: