volatil 可见性,强制刷新主存中的变量到各个CPU的缓存中,使各个CPU中缓存的变量与主存中一致,各个线程所使用的变量一致,读一致性【线程A写变量后刷新到主存中,线程B会刷新自己缓存中的变量=主存中的变量(即线程A写后的变量),如果变量没有用volatile修饰,线程B缓存中的变量不会刷新,即volatile保证了变量对每个线程是可见的】,但是volatile不具有传递性,即volatile修饰的对象的内部属性不具有可见性
atomic类,将读写操作封装成一步,即变量具有原子性。如 i++,那么每个线程的缓存都会去读取上一个线程操作后的变量(上一个线程会将操作后的变量刷回到主存中),可以看到atomic类中的变量都是 volatile 修饰的,即 原子性以可见性为前提
synchronized,保证同一时间只有一个线程进入代码块,即整个代码块的原子性