肯定能啊。
但是:
比如单例模式里面的双检锁dcl,为什么还要加volatile禁止指令重排序呢??

class Singleton{private static Singleton instance;private  Singleton(){}public static Singleton getInstance(){if(instance==null){synchronized (Singleton.class){if(instance==null){ instance=new Singleton();}}}return instance;}
}

那我们首先要明白:
为啥synchronized无法禁止指令重排,但可以保证有序性?
加了锁之后,只能有一个线程获得到了锁,获得不到锁的线程就要阻塞。所以同一时间只有一个线程执行,相当于单线程,而单线程的指令重排是没有问题的。


上述代码的字节码:

  • 17:new 一个对象
  • 20:复制一份对象引用//地址
  • 21:利用一个对象引用,调用构造方法。//根据引用地址调用
  • 24:表示利用一个对象引用,赋值给static instance

jvm(java virtual machine)可能会先执行24,在执行21。即先赋值,再引用。加了synchronized相当于是单线程。没有问题的。但比如线程1获得到了锁,先执行24,在执行21。此时线程2也执行判断实例不为空,直接执行到了37步,得到了静态变量引用,然后return,之后开始使用这个对象了。与此同时线程1的 21(初始化)还没有完成。
所以问题就是线程2使用的对象可能是未完全初始化的对象。
最好的解决有序性问题的办法,就是禁止处理器优化和指令重排,就像volatile中使用内存屏障一样。

synchronized能不能保证有序性??相关推荐

  1. Java面试之Synchronized无法禁止指令重排却能保证有序性

    为什么Synchronized无法禁止指令重排,却能保证有序性 前言 首先我们要分析下这道题,这简单的一个问题,其实里面还是包含了很多信息的,要想回答好这个问题,面试者至少要知道一下概念: Java内 ...

  2. volatile能保证有序性

    在前面提到volatile关键字能禁止指令重排序,所以volatile能在一定程度上保证有序性. volatile关键字禁止指令重排序有两层意思: 1)当程序执行到volatile变量的读操作或者写操 ...

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

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

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

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

  5. x86 CPU内存屏障保证有序性

  6. 底层系统如何实现数据一致性/系统底层如何保证有序性

  7. Java中如何保证线程安全性

    一.线程安全在三个方面体现 1.原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized): 2.可见性:一个线程对主内存的修改可以及时地被其他线程看到,( ...

  8. 2021-11-10

    JVM JavaComplier : 就是我们常见的javac指令, 将Java代码转化为字节码文件. JVM: java虚拟机, 负责 将字节码文件解释为本机机器语言运行 JIT: JVM内部的实时 ...

  9. 大数据开发面试题总结-超详细

    1.文件上传: 总结: 客户端上传请求--->namenode检查,返回响应--->客户端真正的文件上传请求,包括文件名,文件大小--->namenode返回上传节点--->客 ...

最新文章

  1. 【Java_基础】Java中Native关键字的作用
  2. 企业高管眼中的 SAP 和「智慧企业」| 品读中国企业数字化转型的故事
  3. Java19-day10【标准输入输出流、字节字符打印流、对象序列化-反序列化流、serialVersionUIDtransient、Properties】
  4. 【Linux】一步一步学Linux——usermod命令(86)
  5. linux下drcom无法上网,drcom为什么还是不能上网啊!
  6. mq补偿机制java代码_RocketMQ源码分析之消息消费机制-消费端消息负载均衡机制与重新分布 - Java 技术驿站-Java 技术驿站...
  7. UNIX网络编程(第三版 ) 测试代码 7.3
  8. 计算机语言的比较英文论文,科学网—撰写高质量英文科技论文的心态、布局、程序和方法 - 岳中琦的博文...
  9. linux 权限rwx(4,2,1)详细说明
  10. geitee仓库项目拉到(克隆到)本地
  11. MySQL--当事务遇到DDL命令
  12. script标签的for属性和event属性
  13. ffmpeg系列之编译安卓版ffmpeg库
  14. sql注入工具--Sqlmap
  15. 日志易陈军:迭代加速,日志分析助力IT智能化
  16. .net core 上传文件到服务器
  17. Shellsploit注入器简单利用
  18. ShadowGun 飘动的旗帜
  19. 数字温湿度传感器DHT11模块
  20. 小红帽Linux命令安装软件,linux-rpm功能及yum安装命令

热门文章

  1. 广州商学院Python正方教务系统爬虫(获取个人信息成绩课表修改密码)
  2. Exchange Server 2016管理系列课件19.开启和管理存档邮箱
  3. 《Python数据分析与挖掘实战》一第1章 数据挖掘基础1.1 某知名连锁餐饮企业的困惑...
  4. canvas-绘制矩形-读书笔记
  5. vs code 列编辑模式
  6. android地图定位
  7. 数据访问层之数据库访问设计(转)
  8. sklearn网格搜索
  9. Python杂谈——Python都能干什么呢?
  10. php选取远程文件到本地,PHP实现的一个保存远程文件到本地的函数分享