在《synchronized 的另个一重要作用:内存可见性》这篇文中,讲述了通过同步实现内存可见性的方法,在《Volatile 关键字(上)》这篇文中,讲述了通过 volatile 变量实现内存可见性的方法,这里比较下二者的区别。
加锁(synchronized 同步)的功能不仅仅局限于互斥行为,同时还存在另外一个重要的方面:内存可见性。我们不仅希望防止某个线程正在使用对象状态而另一个线程在同时修改该状态,而且还希望确保当一个线程修改了对象状态后,其他线程能够看到该变化。而线程的同步恰恰也能够实现这一点。内置锁可以用于确保某个线程以一种可预测的方式来查看另一个线程的执行结果。
不可变对象就是初始化之后不能够被修改的对象,那么是不是类中引入了不可变对象,所有对不可变对象的修改都立马对所有线程可见呢?实际上,不可变对象只能保证在多线程环境中,对象使用的安全性,并不能够保证对象的可见性。
关注时代Java