可见性:一个线程对共享变量值的修改,能够及时的被其它线程看到。
共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。所有的变量都存储在主内存中
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