Java面试之Synchronized无法禁止指令重排却能保证有序性
为什么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无法禁止指令重排却能保证有序性相关推荐
- 一道题决定去留:为什么synchronized无法禁止指令重排,却能保证有序性?
前几天有一位读者找我问一个问题,说是这道题可能影响了他接下来3年的技术成长. 据说这位读者前面的很多问题会的都还可以,属于那种可过可不过的类型的,面试官出了最后一道题,就是回答的满意就可以给Offer ...
- 一道大题决定去留:为什么synchronized无法禁止指令重排,却能保证有序性?
△Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 253篇原创分享 作者 l Hollis 来源 l Java之道(ID:javaways) 前几天有一位读者找我问一个问题 ...
- Volatile禁止指令重排
Volatile禁止指令重排 计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令重排,一般分为以下三种: 源代码 -> 编译器优化的重排 -> 指令并行的重排 -> 内存系 ...
- volatile学习(可见性,不保证原子性,禁止指令重排(双端检索机制))
volatile是java虚拟机提供的轻量级的同步机制: 1.保证可见性:线程之间可见性(及时通知) 2.不保证原子性 3.禁止指令重排 先了解一下jvm同步 由于JVM运行程序的实体是线程,而每个线 ...
- Volatile:可见性保证+禁止指令重排
Volatile 1.可见性保证 1.1 何为可见性 1.2 JAVA内存模型 1.3 voletile的实现原理 1.4.synchronized 关键字和 volatile 关键字的区别 2.禁止 ...
- 两个例子详解并发编程的可见性问题和有序性问题,通过volatile保证可见性和有序性以及volatile的底层原理——缓存一致性协议MESI和内存屏障禁止指令重排
1. 并发编程的可见性问题 2. 并发编程的有序性问题 3. 使用volatile关键字解决可见性问题 4. 可见性问题的本质--缓存不一致 因为cpu执行速度很快,但是内存执行速度相对于CPU很慢, ...
- Volatile-3.禁止指令重排
volatile禁止指令重排 JMM要求有序性 计算机在执行程序时,为了提高性能,编译器和处理器常常会做指令重排,一把分为以下3种 单线程环境里面确保程序最终执行结果和代码顺序执行的结果一致.(单线程 ...
- Java面试之synchronized的前世今生
文章目录 synchronized原理 实现原理 锁优化 偏向锁 获得锁 撤销锁 轻量级锁 加锁 解锁 重量级锁 其他优化 自旋锁与自适应自旋锁 锁消除 锁粗化 锁的优缺点对比 synchronize ...
- Java面试之synchronized和Lock有什么区别?
1.原始构成 synchronized是关键字,属于JVM层面 monitorenter,monitorexit(底层是通过monitor对象来完成,其实wait/notify等方法也依赖于monit ...
最新文章
- mysql中00933错误_java.sql.SQLException: ORA-00933: SQL 命令未正确结束错误解决
- 深入分析 Java I/O 的工作机制
- C#设计模式之:抽象工厂模式与反射
- java 怎么判别注释符_java学习笔记二(注释、关键字、标识符)
- spring4.0之二:@Configuration的使用
- windows系统作为客户端时,linux中本地yum源挂载时,如何同时挂载DVD1和DVD2?
- AutoMapper 9.0的改造(续)
- 用yum装程序 报[Errno 12] Timeout on Trying other mirror.
- cnn文本分类python实现_CNN文本分类
- 字符串截取mysql
- 算法----并行算法
- php debug 打印变量_PHP_Debug显示所有变量
- INCEPTION 编译过程报错 make[2]: * [sql/CMakeFiles/sql.dir/sql_yacc.cc.o] Error
- Flex 4与自定义循环布局(转)
- adc0808模数转换实验报告_ADC0808模数转换显示 单片机程序
- 微信 分享领券 php,微信卡券货架显示已领取
- 电路图中电阻分类字母速记说明图文
- js删除对象的某个属性
- 腾讯求职经历(后附大量面试题)
- Win10无法访问移动硬盘怎么解决
热门文章
- SharePoint中添加或者修改Item时调用EventReceiver(Event Handler)处理额外的逻辑
- Java笔试面试练习题---集合
- php 租房子(练习题)
- [安卓基础] 009.组件Activity详解
- HDU1233——还是通常工程(最小生成树,并查集)
- ibatis Dynamic总结(ibatis使用安全的拼接语句,动态查询)
- 一加6手机突然没信号没服务器,如何从技术上解决手机信号问题?一加6替你想到了...
- mysql char类型c 映射_使用Hibernate原生SQL映射MYSQL的CHAR(n)类型到String时出错
- Spark Streaming之运行原理
- (200)FPGA芯片选择原则