可见性案例原理分析

来源:互联网 发布:文件夹备份软件 编辑:程序博客网 时间:2024/06/06 03:10
public class RunThread extends Thread{
private volatile boolean isRunning = true;//如果加上volatile 当前变量改变的时候 会强制“引用此变量”的线程 来重新读取此变量的值
private void setRunning(boolean isRunning){
this.isRunning = isRunning;
}

/**
* 注解:jdk1.5以后 对每一个线程分配一块空间 用来存放主内存中一些引用(拷贝一些副本,如案例中的isRunning),从而提升执行的效率

* TODO 简单描述该方法的实现功能(可选).
* @see java.lang.Thread#run()
*/
public void run(){//
System.out.println("进入run方法...");
while(isRunning == true){

}
System.out.println("线程停止");
}

public static void main(String[] args) throws InterruptedException {
RunThread rt = new RunThread();
rt.start();
Thread.sleep(3000);
rt.setRunning(false);
System.out.println("isRunning的值已经被设置成了false");
Thread.sleep(1000);
System.out.println(rt.isRunning);
}

}


volatile不具备原子性,实验如下

public class VolatileNoAtomic extends Thread{
private static volatile int count;
// private static AtomicInteger count = new AtomicInteger(0);
private  static void addCount() {
for(int i=0;i<1000;i++){
count++;
// count.incrementAndGet();
}
System.out.println(count);
}


public  void run(){
addCount();
}

public static void main(String[] args) {
VolatileNoAtomic[] arr = new VolatileNoAtomic[10];
for(int i=0;i<10;i++){
arr[i] = new VolatileNoAtomic();
}

for(int i=0;i<10;i++){
arr[i].start();
}
}
}