Java 多线程重排序的探究
最近在看《Java 并发编程实战》,之前对所谓的线程的重排序一脸懵逼,今天终于有了点理解。
我们先来看下这个实例Demo
/**
* 线程的重排序问题
* **/
public class PossibleReordering { static int x=0,y=0; static int a=0,b=0; public static void main(String[] args) throws InterruptedException {
Thread oneThread=new Thread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
a=1;// a=0---->1
x=b;// x=b=0
}
}); Thread twoThread=new Thread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
b=1;//b=1
y=a;//y=a=1
}
}); oneThread.start(); twoThread.start(); oneThread.join(); twoThread.join(); /**
* 如果不指定线程一和线程二的先后顺序,结果会不可知
* 情况一:
* 线程一先执行,线程二后执行
* x=0,y=0
* 情况二:
* 线程二先执行, 线程一后执行
* x=0,y=0
* 情况三:
* 线程一和线程二交替执行
* x=0,y=1
* 情况四:
* x=1,y=1
* 情况五:
* x=1,y=0
* 其他情况:
* ...
* **/
System.out.println("x="+x+",y="+y);
}
}
在上面这个代码中由于没有指定线程一和线程二的先后顺序,因此执行这段代码后,会有一个神奇的现象。
执行后输出结果可能是
x=0,y=1
但是过一小会再次执行就可能变成
x=1,y=0
这就是线程重排序的一个现象。
所谓的线程重排序用通俗易懂的话来说就是,线程一和线程二的执行先后顺序在第一次执行和第二次执行后可能会重新排序。
Java 多线程重排序的探究的更多相关文章
- Java指令重排序在多线程环境下的应对策略
一.序言 指令重排在单线程环境下有利于提高程序的执行效率,不会对程序产生负面影响:在多线程环境下,指令重排会给程序带来意想不到的错误. 本文对多线程指令重排问题进行复原,并针对指令重排给出相应的解决方 ...
- java指令重排序的问题
转载自于:http://my.oschina.net/004/blog/222069?fromerr=ER2mp62C 指令重排序是个比较复杂.觉得有些不可思议的问题,同样是先以例子开头(建议大家跑下 ...
- Java多线程同步问题的探究
一.线程的先来后到——问题的提出:为什么要有多线程同步?Java多线程同步的机制是什么? http://www.blogjava.net/zhangwei217245/archive/2010/03/ ...
- Java 多线程 重入锁
作为关键字synchronized的替代品(或者说是增强版),重入锁是synchronized的功能扩展.在JDK 1.5的早期版本中,重入锁的性能远远好于synchronized,但从JDK 1.6 ...
- Java多线程专题1: 并发与并行的基础概念
合集目录 Java多线程专题1: 并发与并行的基础概念 什么是多线程并发和并行? 并发: Concurrency 特指单核可以处理多任务, 这种机制主要实现于操作系统层面, 用于充分利用单CPU的性能 ...
- Java的多线程机制系列:不得不提的volatile及指令重排序(happen-before)
一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...
- Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)
一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...
- 【java多线程系列】java内存模型与指令重排序
在多线程编程中,需要处理两个最核心的问题,线程之间如何通信及线程之间如何同步,线程之间通信指的是线程之间通过何种机制交换信息,同步指的是如何控制不同线程之间操作发生的相对顺序.很多读者可能会说这还不简 ...
- Java内存模型_重排序
重排序:是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段 1..编译器优化的重排序.编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序. 2..指令级并行的重排序.现 ...
随机推荐
- 【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-6 直接光源采样
Chapter7 Sample Lights Directly Preface 今天我们来讲这个还算牛逼的技术——直接光源采样 之前我们提到过,在2-7 前两篇我们也提到要减少噪点,就是图片上的黑点 ...
- MD5_Util工具类代码
package com.yby.mall.utils; import java.math.BigInteger; import java.security.MessageDigest; public ...
- AspectJ 切面注解中五种通知注解:@Before、@After、@AfterRunning、@AfterThrowing、@Around
https://blog.csdn.net/u010502101/article/details/78823056
- visual studio 加入zen-codding
大家都知道zen codding的强大之处大家都知道了,那如何让visual studio也支持呢,直接下载插件安装即可: 插件下载地址:zen-codding for visual studio下载 ...
- SQL varbinary varchar 互转
--============================================== -- FUNCTION varbin2hexstr -- 将 varbinary 类型的数据转换为 v ...
- 你真的了解META-INF吗?
你真的了解META-INF吗? 做过JAVA EE开发的工程师应该都知道在JAVA build出来的JAR或者WAR的顶层目录下有个META-INF文件夹吧,可是有多少人能够清楚说出这个文件夹到底是做 ...
- 【Linux入门学习之】vi/vim编辑器必知必会
vi 在当前打开的文件内容中翻页:PageUp.PageDown 一.我们为什么要学习vim编辑器? Linux的命令行界面下面有非常多的文本编辑器.比如经常听说的就有Emacs.pico.nano. ...
- [NOIP2018]OI之旅的中转站
咳咳(清嗓子) 好了,现在NOIP2018结束了 作为初三的一名没考到一等的选手,非常抱歉,我不能继续参加了 那么……我接下来的目标就是中考了(虽然现实很残酷) 能不能继续自己的OI路,就要看自己了 ...
- Java 构造器 遇到多个构造器时要考虑用构建器
静态工厂和构造器有个共同的局限性:它们都不能很好地扩展到大量的可选参数. 当一个类中有若干个必选属性和多个可选属性时,采用重叠构造器模式.JavaBeans模式或者Builder模式,但各有优劣. 当 ...
- js 操作数组
数组的增删 数组的尾部插入一个元素 var nums = [0,1,2,3,4]; nums.push(5,6,6); //[0,1,2,3,4,5,6,6] 删除数组尾部的元素 var nums = ...