1、什么是内存可见性问题?
内存可见性问题是,当多个线程操作共享数据时,彼此不可见。即:线程1更改了共享数据的值,线程2读取的还是未改变之前的。
2、解决办法
1、同步锁(会影响效率)
package com.xue;
/**
*
* @author 薛向毅
* @create 2018-06-24 17:04
**/
public class TestVolatile {
public static void main(String[] args) {
ThreadDemo td = new ThreadDemo();
new Thread(td).start();
while(true){
synchronized (td){
if(td.isFlag()){
System.out.println("-------");
break;
}
}
}
}
}
class ThreadDemo implements Runnable{
private boolean flag = false;
@Override
public void run() {
flag = true;
System.out.println("flag = "+isFlag());
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public boolean isFlag() {
return flag;
}
}
2、volatile关键字
当多个线程操作共享数据时,可以保证内存中的数据是可见的。
将共享变量使用volatile修饰。
package com.xue;
/**
* @author 薛向毅
* @create 2018-06-24 17:04
**/
public class TestVolatile {
public static void main(String[] args) {
ThreadDemo td = new ThreadDemo();
new Thread(td).start();
while (true) {
if (td.isFlag()) {
System.out.println("-------");
break;
}
}
}
}
class ThreadDemo implements Runnable {
private volatile boolean flag = false;
@Override
public void run() {
flag = true;
System.out.println("flag = " + isFlag());
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public boolean isFlag() {
return flag;
}
}
volatile相较于synchronized是一种较为轻量级的同步策略。
注意:1、volatile 不具备“互斥性”;
2、volatile 不能保证变量的“原子性”;