可见性:一个线程对共享变量值的修改,能够及时的被其它线程看到。
共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。所有的变量都存储在主内存中
JAVA内存模型(JVM)
两条规定
共享变量可见性实现的原理
线程1对共享变量的修改要想被线程2及时看到,必须要经过如下2个步骤:
public class SynchronizedDemo { private boolean ready = false; private int result = 0; private int number = 1; /** * 写操作 */ public void write(){ ready = true; //1.1 number = 2; //1.2 } /** * 读操作 */ public void read(){ if(ready){ //2.1 result = number*3; //2.2 } System.out.println("result的值为:"+result); } private class ReadWriteThread extends Thread{ private boolean flag; public ReadWriteThread(boolean flag){ this.flag = flag; } @Override public void run(){ if(flag){ //构造方法中传入true,执行写操作 write(); }else{ //构造方法中传入true,执行读操作 read(); } } } public static void main(String[] args) { SynchronizedDemo demo = new SynchronizedDemo(); //启动线程执行写操作 demo.new ReadWriteThread(true).start(); //启动线程执行读操作 demo.new ReadWriteThread(false).start(); } }
public class VolatileDemo { private volatile int number = 0; public int getNumber(){ return this.number; } public void increase(){ this.number++; } public static void main(String[] args) { final VolatileDemo demo = new VolatileDemo(); for(int i = 0;i<500;i++){ new Thread(new Runnable(){ @Override public void run() { demo.increase(); } }).start();; } //如果还有子线程在运行,主线程就让出cpu资源 //直到所有子线程都运行完了,主线程再继续往下执行 while(Thread.activeCount()>1){ Thread.yield(); } System.out.println("number:"+demo.getNumber()); } }
原文地址:http://blog.csdn.net/lovesomnus/article/details/44901443