实际上java内存模型是如上图所示一样
每个线程有自己的栈内存,存放共享对象的副本,本地变量
每个线程自己的本地变量是不可见的,但是共享对象对每个线程都是可见的。
如果想实现线程通信的话,
线程对共享对象的修改,实际上是首先对本地副本修改,然后修改主内存,堆内存,通信线程再去修改。
如果想保证线程之间的共享对象的可见性, 可以采用volidate关键字修饰, 他强制线程每次从主存读取,修改后立刻刷新到主存
而保证防止多个线程同时修改本地变量后,主内存防止产生错误数据, synchronize关键字可以解决