/** * 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