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 {@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)相关推荐
- 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 ...
- java volatile i_为啥Java里面volatile 修饰的i++还是线程不安全的
在Sun的JDK官方文档是这样形容volatile的:The Java programming language provides a second mechanism, volatile field ...
- java opc连接测试,java连接opc读取数据实例及文档
[实例简介] 在已有java web工程里添加读取opc的接口类.附有详细说明操作步骤. [实例截图] [核心代码] f9c60785-5c7a-42c8-a6ff-67244cf5c251 ├── ...
- java环形队列测试,JAVA数据结构之循环队列的实现
1.循环队列CircleQueue类的实现代码如下所示: public class CircleQueue { private Object[] array; private int capacity ...
- java线程池测试,Java线程池【测试Markdown样式】
Java 线程池 目录 重点关注几个问题: 线程池中线程的生命周期 线程池启动后,如何初始化工作线程 线程数如何变化 如何管理空闲的线程 提交任务给工作线程.到工作线程完成任务的过程 线程池内异常处理 ...
- java volatile原理A CUP层面
作者:知乎用户 链接:https://www.zhihu.com/question/49656589/answer/117826278 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业 ...
- [Java并发编程(三)] Java volatile 关键字介绍
[Java并发编程(三)] Java volatile 关键字介绍 摘要 Java volatile 关键字是用来标记 Java 变量,并表示变量 "存储于主内存中" .更准确的说 ...
- android应用测试与调试实战_实战 | Java 服务端和 Android 端手工测试覆盖率统计的实现...
本文为霍格沃兹测试学院优秀学员关于后端和 App 端手工测试覆盖率的学习笔记.测试开发进阶学习,文末加群. 一.前言 代码测试覆盖率工具流行了这么多年,已经有很多成熟方案比如 Jacoco,我司近一段 ...
- java代码批量下载_Java代码实战:线程池实现批量下载文件
今天技术之家陪你一起Java代码实战:线程池实现批量下载文件: 1 创建线程池package com.cheng.webb.thread; import java.util.concurrent.Ar ...
最新文章
- vs2010常用快捷键
- idea中build项目之后生成的target看不见
- 美国和中国将成数据中心建设首选之地
- PHP: 关键字global 和 超全局变量$GLOBALS的用法、解释、区别
- c++类指针赋值表达式必须是可修改的左值_C++笔记 · 右值引用,移动语义,移动构造函数和移动赋值运算符
- cad图纸怎么看懂_快速看懂cad图纸的教程全解
- ruby + cucumber环境搭建
- android摇一摇切换配置,逍遥模拟器也可以摇一摇了 附设置教程
- Redis 持久化,写入磁盘的方式
- ArtWork(并查集+降维)
- c 语言 用矩形法求定积分,如何用矩形法(梯形法)求定积分
- flowable-ui(v6.7.2)简单的请假流程审批操作(二)
- java写怪物类_JAVA开发,创建英雄与怪物类,查询经验值
- linux操作系统培训_免费在线技术培训丨SLE201v15 SUSE Linux Enterprise Server 15 管理课程...
- 智和网管平台SugarNMS政府部门综合网管解决方案
- tibco EMS 8.2.0安装
- 作业调度和进程调度有什么关系
- JavaSE基础学习——集合
- 【马蜂窝 加速乐cookie】一次坑爹的获取html源代码不到之路
- 计算机技能绘画,电脑绘画技巧