Java原子操作与多线程操作测试一例
来源:互联网 发布:origin怎么保存数据 编辑:程序博客网 时间:2024/06/05 03:40
从别处发现这个有意思的测试, 加不加volatile来修饰变量是有不同的, 具体原因请详究Java的内存模型/线程运行机制/volatile关键字.
Java中的赋值, 除了long和double之外均为原子操作, 也就是说, 在多线程环境中, 在很小很小的几率下会拿到一个既非原值, 又不是其他所赋值的"半个变量". 但是这种情况只是理论上, 在现实中非常罕见, 因为Java强烈建议虚拟机(有很多Java虚拟机, 有些并非官方实现)实现时将long和double都实现成原子操作, 并且很多虚拟机都遵从了Java的建议.
直接贴代码:
/** * 从别处发现这个有意思的测试, 加不加volatile来修饰变量是有不同的, 具体原因请详究Java的内存模型/线程运行机制/volatile关键字 * * 由于check()方法中的if判断不是原子操作, 所以是会打印Error的 * * @author David Ding * */public class ThreadSharedField {//private long shared = 0;private volatile long shared = 0;public void set0() {shared = 0;}public void set1() {shared = 1;}public void check() {if (0 != shared && 1 != shared) {System.err.println("Error");}}public static void main(final String[] args) {final ThreadSharedField v = new ThreadSharedField();// 线程 1:设置 b = 0final Thread set0Th = new Thread() {public void run() {while (true) {v.set0();}};};set0Th.start();// 线程 2:设置 b = 1final Thread set1Th = new Thread() {public void run() {while (true) {v.set1();}};};set1Th.start();// 线程 3:检查 0 != b && 1 != bfinal Thread testTh = new Thread() {public void run() {while (true) {v.check();}};};testTh.start();}}
0 0
- Java原子操作与多线程操作测试一例
- 多线程与原子操作
- JVM线程测试与java原子操作
- Java多线程复习与巩固(七)--原子性操作
- java原子操作与并发
- Java 原子操作与并发
- Java多线程-(6)java 原子操作
- volatile AtomicInteger java多线程操作 原子性
- Java多线程--原子操作的原理
- Java多线程/并发16、Atomic原子变量和原子操作
- 多线程----原子操作
- windows多线程--原子操作
- 多线程之原子操作
- 多线程 之原子操作
- 多线程-原子操作
- windows多线程--原子操作
- 多线程-原子操作
- 多线程原子操作:AtomicBoolean
- 修改EditText光标颜色
- eclipse4.5在线安装Aptana3插件报错解决方案
- ReactNative集成Reduex,下载Demo报错
- CSDN Markdown编辑器语法案例
- eclipse安装Aptana 插件,并设置使之能提示css,js,html,帮助编写代码
- Java原子操作与多线程操作测试一例
- win32 映射模式
- amr 编译脚本
- nginx+ftp实现图片的上传与访问
- 汇编语言学习笔记第二章 寄存器
- 如何用QuickBI制作图表联动的销售报表
- javascript对象
- nginx和ftp图片服务器的搭建记录
- 数据库安全性