一、要想并发程序正确地执行、必须保证:原子性、可见性、有序性
volatile:支持【可见性】、【有序性(避免重排序)】、但无法保证原子性
可见性:程序中的数据是放在主内存中、每个CPU都有自己的高速缓存区、CPU在读取主内存数据时、会把主内存的数据复制到自己的缓存中、用完后再还回去、如果在还回去时、这个变量被其他CPU修改、此时就会出现数据不一致;故需要当一个线程修改变量时、让其他线程也能同时获取更新的值、此时就需要使用volatile
public class TestDemo extends Thread {
static volatile boolean isboolean=true;
@Override
public void run() {
while (isboolean);
System.out.println("线程结束");
}
public static void main(String[] args) throws Exception{
new TestDemo().start();
Thread.sleep(2000);
isboolean=false;
System.out.println("over");
}
}
有序性:程序中创建一个对象在内存中分为三个步骤:1、分配空间;2、给空间赋值;3、把引用地址赋值给变量;由于CPU运行速度非常快,可能执行的顺序是 123、亦可能是 132、如果第一个CPU执行的顺序是123、另一个CPU执行的顺序是132、此时创建的对象就可能出现错误、故需要给变量添加volatile关键字、让其创建过程需要一致!
二、Synchronized、Lock、Cas:支持原子性