解释
volatile具有可见性,禁止指令重拍,不保证原子性的性质
当num不加volatile时
/**
* volatile原子可见性
* @author llj
* @2019年11月18日-下午2:40:26
*
*/
class Data{
int num = 10;//不加volatile
public void setNum() {
num = 20;
}
}
public class VolatileDemo {
public static void main(String[] args) {
Data myData = new Data();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//修改num值
myData.setNum();
System.out.println("num 修改成功");
}
}).start();
//判断是否被修改
while(myData.num==10) {
//等于10一直循环等待
}
//等于20就执行
System.out.println("num 是可见的");
}
}
看到num已经修改成功,可是在while里num还是等于10一直处于等待
给num加volatile
class Data{
volatile int num = 10;
public void setNum() {
num = 20;
}
}
public class VolatileDemo {
public static void main(String[] args) {
Data myData = new Data();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//修改num值
myData.setNum();
System.out.println("num 修改成功");
}
}).start();
//判断是否被修改
while(myData.num==10) {
//等于10一直循环等待
}
//等于20就执行
System.out.println("num 是可见的");
}
}
发现可见了
****2,再来一个
- flag不加volatile的情况下
public class VolatileTest {
public static void main(String[] args) {
ThreadDemo threadDemo = new ThreadDemo();
new Thread(threadDemo).start();
while(true) {
if(threadDemo.flag) {
System.out.println("flag:true");
}
}
}
}
class ThreadDemo implements Runnable {
boolean flag = false;
@Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = true;
if(flag) {
System.out.println("flag="+flag);
}
}
}
2)flag加上volatile
public class VolatileTest {
public static void main(String[] args) {
ThreadDemo threadDemo = new ThreadDemo();
new Thread(threadDemo).start();
while(true) {
if(threadDemo.flag) {
System.out.println("flag:true");
}
}
}
}
class ThreadDemo implements Runnable {
volatile boolean flag = false;
@Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = true;
if(flag) {
System.out.println("flag="+flag);
}
}
}
运行结果:加上volatile具有可见性