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 {@Overridepublic 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 {@Overridepublic 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

Java volatile 的测试(Java代码实战-004)相关推荐

  1. Java框架JSON-RPC项目demo代码实战 + JAVA WEB配置虚拟目录(转自21天java web开发)

    Java框架JSON-RPC项目demo代码实战 备注  JAVA WEB配置虚拟目录(转自21天java web开发) https://blog.csdn.net/wjxbj/article/det ...

  2. java volatile i_为啥Java里面volatile 修饰的i++还是线程不安全的

    在Sun的JDK官方文档是这样形容volatile的:The Java programming language provides a second mechanism, volatile field ...

  3. java opc连接测试,java连接opc读取数据实例及文档

    [实例简介] 在已有java web工程里添加读取opc的接口类.附有详细说明操作步骤. [实例截图] [核心代码] f9c60785-5c7a-42c8-a6ff-67244cf5c251 ├── ...

  4. java环形队列测试,JAVA数据结构之循环队列的实现

    1.循环队列CircleQueue类的实现代码如下所示: public class CircleQueue { private Object[] array; private int capacity ...

  5. java线程池测试,Java线程池【测试Markdown样式】

    Java 线程池 目录 重点关注几个问题: 线程池中线程的生命周期 线程池启动后,如何初始化工作线程 线程数如何变化 如何管理空闲的线程 提交任务给工作线程.到工作线程完成任务的过程 线程池内异常处理 ...

  6. java volatile原理A CUP层面

    作者:知乎用户 链接:https://www.zhihu.com/question/49656589/answer/117826278 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  7. [Java并发编程(三)] Java volatile 关键字介绍

    [Java并发编程(三)] Java volatile 关键字介绍 摘要 Java volatile 关键字是用来标记 Java 变量,并表示变量 "存储于主内存中" .更准确的说 ...

  8. android应用测试与调试实战_实战 | Java 服务端和 Android 端手工测试覆盖率统计的实现...

    本文为霍格沃兹测试学院优秀学员关于后端和 App 端手工测试覆盖率的学习笔记.测试开发进阶学习,文末加群. 一.前言 代码测试覆盖率工具流行了这么多年,已经有很多成熟方案比如 Jacoco,我司近一段 ...

  9. java代码批量下载_Java代码实战:线程池实现批量下载文件

    今天技术之家陪你一起Java代码实战:线程池实现批量下载文件: 1 创建线程池package com.cheng.webb.thread; import java.util.concurrent.Ar ...

最新文章

  1. vs2010常用快捷键
  2. idea中build项目之后生成的target看不见
  3. 美国和中国将成数据中心建设首选之地
  4. PHP: 关键字global 和 超全局变量$GLOBALS的用法、解释、区别
  5. c++类指针赋值表达式必须是可修改的左值_C++笔记 · 右值引用,移动语义,移动构造函数和移动赋值运算符
  6. cad图纸怎么看懂_快速看懂cad图纸的教程全解
  7. ruby + cucumber环境搭建
  8. android摇一摇切换配置,逍遥模拟器也可以摇一摇了 附设置教程
  9. Redis 持久化,写入磁盘的方式
  10. ArtWork(并查集+降维)
  11. c 语言 用矩形法求定积分,如何用矩形法(梯形法)求定积分
  12. flowable-ui(v6.7.2)简单的请假流程审批操作(二)
  13. java写怪物类_JAVA开发,创建英雄与怪物类,查询经验值
  14. linux操作系统培训_免费在线技术培训丨SLE201v15 SUSE Linux Enterprise Server 15 管理课程...
  15. 智和网管平台SugarNMS政府部门综合网管解决方案
  16. tibco EMS 8.2.0安装
  17. 作业调度和进程调度有什么关系
  18. JavaSE基础学习——集合
  19. 【马蜂窝 加速乐cookie】一次坑爹的获取html源代码不到之路
  20. 计算机技能绘画,电脑绘画技巧

热门文章

  1. hdu 4945 2048(DP)
  2. mysql模糊查询的优化方法--亲自实践
  3. android ListView包含Checkbox滑动时状态改变
  4. Stimulsoft Reports.Net基础教程(十):创建图表报表②
  5. Sql Server导出表结构Excel
  6. 实习生笔试面试题总结
  7. Excel万年历的制作
  8. FreeSWITCH配置文件详解
  9. apache vhost
  10. [Android] DiffUtil在RecyclerView中的使用详解