即共享变量)的过程:
线程的工作内存会去读取主内存的成员变量并保存副本
线程在工作内存中修改副本
将修改后的副本的值推送给主空间并改写主空间该成员变量的值
主空间成员变量修改后的值将不会主动推送给其他线程..., 这就造成了线程的工作内存的共享变量的不同步
问题: 各个线程的工作内存不可见
即 A线程先读取共享变量a, B线程修改了共享变量a后为a`,推送给主内存并改写, 主内存不会推送给A线程,A和B的变量会不同步...是重量级的同步策略,基于对象的同步锁
2. volatile不具备互斥性, 一个线程访问共享变量 , 其他线程也可以访问共享变量
synchronized是互斥锁, 具备互斥性..., 在被锁的代码块上只能有一个线程访问共享变量
3. volatile不能保证变量的原子性, 即一组对共享变量的操作不具备事务(要么全部完成,要么全部不完成) 如 i++/i--...工作内存中会主动去拉取主内存的共享变量并创建其副本
工作内存中的副本修改后会推送给主内存改写共享变量
volatile 会使得主内存修改后的共享变量推送其他线程
内存不可见的本质