• Java volatile 的测试(Java代码实战-004)


    package Threads;
    
    /**
     * Created by xfyou 2018/5/21 16:07.
     */
    public class VolatileTest {
    
        private static volatile int MY_INT = 0;
    
        /**
         * 主线程启动2个测试子线程
         *
         * @param args null
         */
        public static void main(String[] args) {
            new ChangeListener().start();
            new ChangeMaker().start();
        }
    
        /**
         * 此线程负责对MY_INT值改变的侦听,如果有改变就会打印出来
         */
        static class ChangeListener extends Thread {
            @Override
            public void run() {
                int local_value = MY_INT;
                while (local_value < 5) {
                    if (local_value != MY_INT) {
                        System.out.println("Got Change for MY_INT : " + MY_INT);
                        local_value = MY_INT;
                    }
                }
            }
        }
    
        /**
         * 此线程负责改变MY_INT的值
         */
        static class ChangeMaker extends Thread {
            @Override
            public void run() {
                int local_value = MY_INT;
                while (MY_INT < 5) {
                    System.out.println("Incrementing MY_INT to " + (local_value + 1));
                    MY_INT = ++local_value;
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    当使用volatile时,修改线程对static MY_INT值的修改,另一个侦听线程(读MY_INT的值)是可以及时读取到的,输出结果如下:

    Incrementing MY_INT to 1
    Got Change for MY_INT : 1
    Incrementing MY_INT to 2
    Got Change for MY_INT : 2
    Incrementing MY_INT to 3
    Got Change for MY_INT : 3
    Incrementing MY_INT to 4
    Got Change for MY_INT : 4
    Incrementing MY_INT to 5
    Got Change for MY_INT : 5

    当不使用volatile时,修改线程对static MY_INT值的修改,另一个侦听线程(读MY_INT的值)可能完全读取不到(无感知),可能的输出结果如下:

    Incrementing MY_INT to 1
    Incrementing MY_INT to 2
    Incrementing MY_INT to 3
    Incrementing MY_INT to 4
    Incrementing MY_INT to 5
  • 相关阅读:
    php中的闭包和匿名函数
    php魔术常量
    SQL查询:存在一个表而不在另一个表中的数据
    php发送http请求的几种方式
    php高级工程师面试题
    php中include、require、include_once、require_once的区别
    gitignore规则基础
    Google地图数据算法
    【营销】包子和星座
    【GPS】 数据围栏
  • 原文地址:https://www.cnblogs.com/frankyou/p/9067867.html
Copyright © 2020-2023  润新知