Volatile关键字的特性及其可见性的验证

    技术2024-06-10  74

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

    }

    }

    Processed: 0.011, SQL: 9