1、有序性

指令重排:JVM 会在不影响正确性的前提下,可以调整语句的执行顺序。

2、鱼罐头的故事

加工一条鱼需要50分钟,只能一条鱼,一条鱼顺序加工……

可以将每个鱼罐头的加工流程细分为5个步骤:

  • 去鳞清洗10分钟
  • 蒸煮沥水10分钟
  • 加注汤料10分钟
  • 杀菌出锅10分钟
  • 真空封罐10分钟

即使只有一个工人,最理想的情况是:他能够在10分钟内同时做好这5件事,因为对第一条鱼的真空装罐,不会影响对第二条鱼的杀菌出锅……

3、指令重排序优化

事实上,现代处理器会设计为一个时钟周期完成一条执行时间最长的cpu指令。为什么这么做呢?可以想到指令还可以再划分成一个个更小的阶段,例如,每条指令都可以为:取指令,指令译码,执行指令,内存访问,数据写回这5个阶段。

4、支持流水线的处理器

这五个阶段称之为五结指令流水线,这时cpu可以在同一个时钟周期内,同时运行5条不同阶段(相当与一条执行时间最长的复杂指令),IPC=1,本质上,流水线技术并不能缩短单条指令的执行时间,但它变相地提高了指令地吞吐率。

5、指令重排引起的问题

int num = 0;
boolean ready = false;
// 线程1 执行此方法
public void actor1(I_Resultr) {if(ready) {r.r1 = num + num;  } else {r.r1 = 1;  }
}
// 线程2 执行此方法
public void actor2(I_Resultr) { num = 2;ready = true;
}
  • 情况1:线程1 先执行,这时 ready = false,所以进入 else 分支结果为 1

  • 情况2:线程2 先执行 num = 2,但没来得及执行 ready = true,线程1 执行,还是进入 else 分支,结果为

  • 情况3:线程2 执行到 ready = true,线程1 执行,这回进入 if 分支,结果为 4(因为 num 已经执行过了)

  • 情况4:线程2 执行 ready = true,切换到线程1,进入 if 分支,相加为 0,再切回线程2 执行 num = 2

java并发学习28:有序性相关推荐

  1. Java并发学习二:编译优化带来的有序性问题导致的并发Bug

    Java并发学习系列文章:Java并发学习-博客专栏 今天在学习极客时间专栏:<Java并发编程实战> 第一讲01 | 可见性.原子性和有序性问题:并发编程Bug的源头中提到: 编译器及解 ...

  2. Java并发学习一:CPU缓存导致的可见性问题带来的并发Bug

    Java并发学习系列文章:Java并发学习-博客专栏 今天在学习极客时间专栏:<Java并发编程实战> 第一讲01 | 可见性.原子性和有序性问题:并发编程Bug的源头中提到了: 多核时代 ...

  3. Java并发学习三:银行转账的死锁问题解决及示例

    Java并发学习系列文章:Java并发学习-博客专栏 今天在学习极客时间专栏:<Java并发编程实战> 从03 | 互斥锁(上):解决原子性问题到06 | 用"等待-通知&quo ...

  4. Java并发学习之玩转线程池

    2019独角兽企业重金招聘Python工程师标准>>> 线程池的使用姿势 基本上实际的项目不可能离开线程池,只是看你有没有注意到罢了 作为以业务需求为驱动,最顺溜的是写if-else ...

  5. 面试经验|春招在即,时间宝贵,这一定是最近的 Java 并发学习路线

    多线程这部分内容确实比较高深而且每个知识点之间比较零散,让人摸不着头脑,不知道该从哪里下手.而且对于大部分学生群体来讲,很少有机会接触到高并发这方面的真实场景,平常自己敲代码也基本不会用到,所以也导致 ...

  6. 20W字纯手打Java并发学习笔记,助力你金三银四,决战春招,必进大厂

    假如阿里给了你这个机会,你却卡在三面,你会不会懊恼? 假如阿里真的让你通过,只需要你把这一块技能的底层原理摸透,你学不学? 我有一个朋友,他小厂背景.15年毕业.普通学校,这看起来确实没什么战斗力,但 ...

  7. Java并发学习----大三仔(自己归纳的有错误请指正)

    并发知识学习 三要素 1.原子性.即一个操作要么不做,要么做完,不存在做一半这种情况 2.可见性 .即一个变量被一个线程修改后,其他线程能够立即得知更改后的变量值 3.顺序性.即一连串操作在线程内部看 ...

  8. java并发学习之六:JCSP(Java Communicating Sequential Processes)实践

    首先得描述下什么是JCSP:CSP是Communicating Sequential Processes的缩写 在ibm的developerworks 中国上学习java的并发编程时无意发现的,因为在 ...

  9. Java并发学习笔记:ReentrantLock

    锁的获取主要是这两个函数,当然还有 lockInterruptibly( ) 和 tryLock(long timeout, TimeUnit unit) 这种响应中断和带时间限制的函数,不过和普通的 ...

最新文章

  1. DELPHI 中 Window 消息大全使用详解
  2. 当最懂 5G 的中国移动遇见云,移动云专题赛正式启动!
  3. 分布式实时日志分析解决方案ELK部署架构
  4. 以太网交换机坏了,能否用光纤收发器来替代?
  5. mysql count优化_MySQL count()函数及其优化
  6. display 隐藏css,CSS-元素的显示与隐藏
  7. 实现加载页Loading Page 的几种方法
  8. 盘点 Java 线程池配置的常见误区
  9. 立创eda学习笔记二:画pcb板流程(极简入门版)
  10. python 函数修饰器 父类_Python函数嵌套、回调函数、闭包、装饰器和类
  11. micropython esp32驱动舵机_关于micropython ESP32的MQTT通讯方式控制舵机
  12. Zookeeper之基础知识
  13. Beej网络编程指南《一》
  14. Git查看本机 ssh 公钥或生成公钥
  15. 微信视频直播系统搭建
  16. python123空气质量提醒_用Python实现给女朋友定时推送消息
  17. BYOD策略的制定关乎企业网络安全
  18. 抢占中国P2P海外第一股 宜人贷寓意为何
  19. ...$wux.toast_如何解决Toast#handleShow()的WindowManager.BadTokenException?
  20. MT5 白标专用 清算抛单工具

热门文章

  1. WGS84、GCJ-02、BD-09、图吧坐标简介及坐标转换实现(js版)
  2. EasyNVR网页摄像机直播方案H5前端构建之:如何播放HLS
  3. 计算机关机重启命令,怎么使用dos命令重启电脑?用dos命令重启电脑关机的方法...
  4. Leetcode Golang 77. Combinations.go
  5. Exploring Branch Predictors for Constructing Transient Execution Trojans
  6. 基于vivado DDS ip核的DDS信号发生器(可调频调相)
  7. 华为p30鸿蒙系统内测在哪申请,华为自研操作系统:已注册“华为鸿蒙”商标
  8. kylin 连接mysql_Ubuntu Kylin 安装和配置mysql
  9. 音频之耳机(Exynos7872)
  10. dns服务器配置(本地dns,自己当服务器,自己测试自己)