最近在看《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 多线程重排序的探究的更多相关文章

  1. Java指令重排序在多线程环境下的应对策略

    一.序言 指令重排在单线程环境下有利于提高程序的执行效率,不会对程序产生负面影响:在多线程环境下,指令重排会给程序带来意想不到的错误. 本文对多线程指令重排问题进行复原,并针对指令重排给出相应的解决方 ...

  2. java指令重排序的问题

    转载自于:http://my.oschina.net/004/blog/222069?fromerr=ER2mp62C 指令重排序是个比较复杂.觉得有些不可思议的问题,同样是先以例子开头(建议大家跑下 ...

  3. Java多线程同步问题的探究

    一.线程的先来后到——问题的提出:为什么要有多线程同步?Java多线程同步的机制是什么? http://www.blogjava.net/zhangwei217245/archive/2010/03/ ...

  4. Java 多线程 重入锁

    作为关键字synchronized的替代品(或者说是增强版),重入锁是synchronized的功能扩展.在JDK 1.5的早期版本中,重入锁的性能远远好于synchronized,但从JDK 1.6 ...

  5. Java多线程专题1: 并发与并行的基础概念

    合集目录 Java多线程专题1: 并发与并行的基础概念 什么是多线程并发和并行? 并发: Concurrency 特指单核可以处理多任务, 这种机制主要实现于操作系统层面, 用于充分利用单CPU的性能 ...

  6. Java的多线程机制系列:不得不提的volatile及指令重排序(happen-before)

    一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...

  7. Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)

    一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...

  8. 【java多线程系列】java内存模型与指令重排序

    在多线程编程中,需要处理两个最核心的问题,线程之间如何通信及线程之间如何同步,线程之间通信指的是线程之间通过何种机制交换信息,同步指的是如何控制不同线程之间操作发生的相对顺序.很多读者可能会说这还不简 ...

  9. Java内存模型_重排序

    重排序:是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段 1..编译器优化的重排序.编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序. 2..指令级并行的重排序.现 ...

随机推荐

  1. java多线程之守护线程(Daemon)

    https://blog.csdn.net/u010739551/article/details/51065923/

  2. AS安装过程中出现的错误

    1.首先是You may need to adjust the proxy settings in Gradle.的错误, 主要是看你有没有图中红线所画的gradle的压缩包 如果没有,那就前往htt ...

  3. npm的packagejson文件

    一.name,npm包名name和version字段是package.json文件中最重要的字段,都是必须的字段,如果你的npm包没有指定这两个字段,将无法被安装.name和version字段被假定组 ...

  4. google像apple 30亿美元购买流量

    google花费30亿美元像apple购买流量作为iphone默认搜索引擎.

  5. IO流关键字

  6. Codeforces.578E.Walking(构造)

    题目链接 \(Description\) 给定一个长为\(n\)的足迹序列(只包含\(L,R\)两种字符),你需要\(LRLRLR...\)这样交替在\(L\)和\(R\)上走(第一步可以选择\(L\ ...

  7. centos下python安装与虚拟环境配置

    Centos7下安装Python3.7 首先安装依赖包,centos里面是-devel,如果在ubuntu下安装则要改成-dev,依赖包缺一不可,笔者曾安装python3未成功就是因为没有安装libf ...

  8. 摆脱CSS浏览器私有属性-moz, -ms, -webkit

    为了兼容各个浏览器之间的私有属性,前端开发人员在写css的时候需要给一些css属性添加多个私有前缀,非常麻烦.这里给大家分享一个简单的方法可以让你以后无需手动给CSS添加私有属性. -moz代表fir ...

  9. IIS 日志分析工具:Log Parser Studio

    1.安装Log Parser,下载地址:http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=24659 ...

  10. PHP中new self()和new static()的区别

    1.new static()是在PHP5.3版本中引入的新特性. 2.无论是new static()还是new self(),都是new了一个新的对象. 3.这两个方法new出来的对象有什么区别呢,说 ...