zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    MySQL中interactive_timeout和wait_timeout的区别
    MySQL主从环境下存储过程,函数,触发器,事件的复制情况
    Hbase的伪分布式安装
    当master down掉后,pt-heartbeat不断重试会导致内存缓慢增长
    ERROR 1010 (HY000): Error dropping database (can't rmdir './test/', errno: 17)
    基于MySQL MEB的备份恢复
    pt-heartbeat
    B树和B+树的区别
    如何在Zabbix上安装MySQL监控插件PMP
    如何部署Zabbix服务端
  • 原文地址:https://www.cnblogs.com/frankyou/p/9067867.html
Copyright © 2011-2022 走看看