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);}
}