volatile解决变量可见性
volatile满足变量的可见性,会在写后面插入StoreLoad屏障,操作该关键字修饰的变量不会用CPU缓存,只能从内存中进行读取或写入。
如下代码有可能导致无法中断线程1,因每个线程在运行过程中都有自己的工作内存,那么线程1在运行的时候,会将stop变量的值拷贝一份放在自己的工作内存当中,在线程2更改了stop变量的值之后,但是还没来得及写入主存当中,线程2转去做其他事情了,那么线程1由于不知道线程2对stop变量的更改,因此还会一直循环下去。
线程1 boolean stop = false; while(!stop){ doSomething(); } 线程2 stop = true;
使用volatile修饰stop变量解决该问题。另volatile并不解决原子性问题,如volatile long count=0;有两个线程做count++,得不到正确的结果。
父主题: Java同步原语