为什么Synchronized无法禁止指令重排,却能保证有序性

前言

首先我们要分析下这道题,这简单的一个问题,其实里面还是包含了很多信息的,要想回答好这个问题,面试者至少要知道一下概念:

  • Java内存模型
  • 并发编程有序性问题
  • 指令重排
  • synchronized锁
  • 可重入锁
  • 排它锁
  • as-if-serial语义
  • 单线程&多线程

标准解答

为了进一步提升计算机各方面能力,在硬件层面做了很多优化,如处理器优化和指令重排等,但是这些技术的引入就会导致有序性问题。

先解释什么是有序性问题,也知道是什么原因导致的有序性问题

我们也知道,最好的解决有序性问题的办法,就是禁止处理器优化和指令重排,就像volatile中使用内存屏障一样。

表明你知道啥是指令重排,也知道他的实现原理

但是,虽然很多硬件都会为了优化做一些重排,但是在Java中,不管怎么排序,都不能影响单线程程序的执行结果。这就是as-if-serial语义,所有硬件优化的前提都是必须遵守as-if-serial语义。

as-if-serial语义把单线程程序保护了起来,遵守as-if-serial语义的编译器,runtime 和处理器共同为编写单线程程序的程序员创建了一个幻觉:单线程程序是按程序的顺序来执行的。as-if-serial语义使单线程程序员无需担心重排序会 干扰他们,也无需担心内存可见性问题。

重点!解释下什么是as-if-serial语义,因为这是这道题的第一个关键词,答上来就对了一半了

再说下synchronized,他是Java提供的锁,可以通过他对Java中的对象加锁,并且他是一种排他的、可重入的锁。

所以,当某个线程执行到一段被synchronized修饰的代码之前,会先进行加锁,执行完之后再进行解锁。在加锁之后,解锁之前,其他线程是无法再次获得锁的,只有这条加锁线程可以重复获得该锁。

介绍synchronized的原理,这是本题的第二个关键点,到这里基本就可以拿满分了。

synchronized通过排他锁的方式就保证了同一时间内,被synchronized修饰的代码是单线程执行的。所以呢,这就满足了as-if-serial语义的一个关键前提,那就是单线程,因为有as-if-serial语义保证,单线程的有序性就天然存在了。

来源

https://mp.weixin.qq.com/s/Pd6dOXaMQFUHfAUnOhnwtw

Java面试之Synchronized无法禁止指令重排却能保证有序性相关推荐

  1. 一道题决定去留:为什么synchronized无法禁止指令重排,却能保证有序性?

    前几天有一位读者找我问一个问题,说是这道题可能影响了他接下来3年的技术成长. 据说这位读者前面的很多问题会的都还可以,属于那种可过可不过的类型的,面试官出了最后一道题,就是回答的满意就可以给Offer ...

  2. 一道大题决定去留:为什么synchronized无法禁止指令重排,却能保证有序性?

    △Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 253篇原创分享 作者 l Hollis 来源 l Java之道(ID:javaways) 前几天有一位读者找我问一个问题 ...

  3. Volatile禁止指令重排

    Volatile禁止指令重排 计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令重排,一般分为以下三种: 源代码 -> 编译器优化的重排 -> 指令并行的重排 -> 内存系 ...

  4. volatile学习(可见性,不保证原子性,禁止指令重排(双端检索机制))

    volatile是java虚拟机提供的轻量级的同步机制: 1.保证可见性:线程之间可见性(及时通知) 2.不保证原子性 3.禁止指令重排 先了解一下jvm同步 由于JVM运行程序的实体是线程,而每个线 ...

  5. Volatile:可见性保证+禁止指令重排

    Volatile 1.可见性保证 1.1 何为可见性 1.2 JAVA内存模型 1.3 voletile的实现原理 1.4.synchronized 关键字和 volatile 关键字的区别 2.禁止 ...

  6. 两个例子详解并发编程的可见性问题和有序性问题,通过volatile保证可见性和有序性以及volatile的底层原理——缓存一致性协议MESI和内存屏障禁止指令重排

    1. 并发编程的可见性问题 2. 并发编程的有序性问题 3. 使用volatile关键字解决可见性问题 4. 可见性问题的本质--缓存不一致 因为cpu执行速度很快,但是内存执行速度相对于CPU很慢, ...

  7. Volatile-3.禁止指令重排

    volatile禁止指令重排 JMM要求有序性 计算机在执行程序时,为了提高性能,编译器和处理器常常会做指令重排,一把分为以下3种 单线程环境里面确保程序最终执行结果和代码顺序执行的结果一致.(单线程 ...

  8. Java面试之synchronized的前世今生

    文章目录 synchronized原理 实现原理 锁优化 偏向锁 获得锁 撤销锁 轻量级锁 加锁 解锁 重量级锁 其他优化 自旋锁与自适应自旋锁 锁消除 锁粗化 锁的优缺点对比 synchronize ...

  9. Java面试之synchronized和Lock有什么区别?

    1.原始构成 synchronized是关键字,属于JVM层面 monitorenter,monitorexit(底层是通过monitor对象来完成,其实wait/notify等方法也依赖于monit ...

最新文章

  1. mysql中00933错误_java.sql.SQLException: ORA-00933: SQL 命令未正确结束错误解决
  2. 深入分析 Java I/O 的工作机制
  3. C#设计模式之:抽象工厂模式与反射
  4. java 怎么判别注释符_java学习笔记二(注释、关键字、标识符)
  5. spring4.0之二:@Configuration的使用
  6. windows系统作为客户端时,linux中本地yum源挂载时,如何同时挂载DVD1和DVD2?
  7. AutoMapper 9.0的改造(续)
  8. 用yum装程序 报[Errno 12] Timeout on Trying other mirror.
  9. cnn文本分类python实现_CNN文本分类
  10. 字符串截取mysql
  11. 算法----并行算法
  12. php debug 打印变量_PHP_Debug显示所有变量
  13. INCEPTION 编译过程报错 make[2]: * [sql/CMakeFiles/sql.dir/sql_yacc.cc.o] Error
  14. Flex 4与自定义循环布局(转)
  15. adc0808模数转换实验报告_ADC0808模数转换显示 单片机程序
  16. 微信 分享领券 php,微信卡券货架显示已领取
  17. 电路图中电阻分类字母速记说明图文
  18. js删除对象的某个属性
  19. 腾讯求职经历(后附大量面试题)
  20. Win10无法访问移动硬盘怎么解决

热门文章

  1. SharePoint中添加或者修改Item时调用EventReceiver(Event Handler)处理额外的逻辑
  2. Java笔试面试练习题---集合
  3. php 租房子(练习题)
  4. [安卓基础] 009.组件Activity详解
  5. HDU1233——还是通常工程(最小生成树,并查集)
  6. ibatis Dynamic总结(ibatis使用安全的拼接语句,动态查询)
  7. 一加6手机突然没信号没服务器,如何从技术上解决手机信号问题?一加6替你想到了...
  8. mysql char类型c 映射_使用Hibernate原生SQL映射MYSQL的CHAR(n)类型到String时出错
  9. Spark Streaming之运行原理
  10. (200)FPGA芯片选择原则