/**
* volatile 关键字的作用
* 1、volatile 是弱化版的synchronized
* 2、保证可见性(多个线程操作同一个变量,不同 的线程能共享变量,一个线程修改了值,另一个线程能看到)
* 3、不保证原子性(原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。)
* 多个线程操作一个变量,其中一个线程操作的时候可能会被别的线程插队。
*
*/
代码中的num 如果不用volatile修饰那么循环会一直执行下去的
/**
* 保证可见性的例子
*/
public class JMMDemo {
private volatile static int num = 0;
public static void main(String[] args) { //这是一个线程
new Thread(()->{ // 如果这里 使用的num不用volatile 修饰,这个线程里面的循环会一直执行
while (num == 0){}
},"gao").start();
try{
TimeUnit.SECONDS.sleep(2);
}catch (InterruptedException e){
}
num = 1; //主线程修改值
System.out.println(num);
}
}
//输出的结果大概率不是 10000
public class JMMDemo2 {
private static int num = 1;
public static void add(){
num ++;
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(()->{
for (int j = 0; j < 1000; j++) {
add();
}
},"sss").start();
}
if(Thread.activeCount()>2){ //如果存活的线程数大于2
Thread.yield();
}
System.out.println(num);
}
}
原文:https://www.cnblogs.com/gaohq/p/14802056.html