volatile特性:保证可见性、不保证原子性、有序性(禁止指令重排)
Volatile是java虚拟机提供的轻量级的同步机制
不加Volatile关键字
package com.example.demo;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
-
Created by Administrator on 2020/6/18.
*/
class VDemo {
int num;public void numUpdateTo50() {
num = 50;
}
}
/**
-
验证Volatile的可见性
-
num默认为0 不加Volatile的关键字
*/
public class VolatileDemo {
public static void main(String[] args) {
VDemo vd = new VDemo();
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + “start number:” + vd.num);
try {
TimeUnit.SECONDS.sleep(2);
} catch (Exception e) {
e.printStackTrace();
}
vd.numUpdateTo50();
System.out.println(Thread.currentThread().getName() + “update number:” + vd.num);
}).start();
//如果实现了可见性则跳出下面的循环进行输出
while (vd.num == 0) {} System.out.println(Thread.currentThread().getName() + "main number:" + vd.num);
}
}
加Volatile关键字
package com.example.demo;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
-
Created by Administrator on 2020/6/18.
*/
class VDemo {
volatile int num;public void numUpdateTo50() {
num = 50;
}
}
/**
-
验证Volatile的可见性
-
num默认为0 加Volatile的关键字,看主线程是否能正常输出
*/
public class VolatileDemo {
public static void main(String[] args) {
VDemo vd = new VDemo();
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + “start number:” + vd.num);
try {
TimeUnit.SECONDS.sleep(2);
} catch (Exception e) {
e.printStackTrace();
}
vd.numUpdateTo50();
System.out.println(Thread.currentThread().getName() + “update number:” + vd.num);
}).start();
//如果实现了可见性则跳出下面的循环进行输出
while (vd.num == 0) {} System.out.println(Thread.currentThread().getName() + " main number:" + vd.num);
}
}