栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java进阶教程-马士兵

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java进阶教程-马士兵

一,操作系统原理
ALU是运算单元,PC是程序计数器,Registers寄存器存储运算的数据。L1级缓存,L2级缓存方便对数据进行访问。
携程面试问到volatile可见性的实现,其实是用volatile声明的变量如果被某一个线程修改,首先该值会更新到主存去,通过对读,写设置内存屏障,注意两点1、一旦完成写入,任何访问这个字段的线程将会得到最新的值。2、在写入前,保证所有之前发生的事已经发生,并且任何更新过的数据值也是可见的,因为内存屏障会把之前的写入值都刷新到缓存。这里JVM要求的实现比较严格,存储和存储,读取和读取之间都有内存屏障(实现内存屏障的方式可能是lock锁总线,可能是原语)

二,多线程高并发
1,synchronized
必须是可重入锁:为什么?
当一个子类对象获取了锁,在执行过程中需要调用该子类父类的synchronized方法,由于都要获取一个对象的锁,如果不能重入,就会导致死锁。
synchronized锁的是对象
synchronized锁定的方法和非锁定的方法相互执行不冲突
synchronized不要用String,Integer,Long这些类型

synchronized底层实现(Hotspot的实现)

  1. jdk早期的重量级锁 - 找os申请锁。
  2. 后期改进引入锁升级策略 - sync(obj),第一个线程来获取时,再Markword上记录线程ID(偏向锁,可重入的基础),若有线程争用,则升级为自旋锁,(循环尝试获取锁,尝试10次),10次之后升级为OS层面的锁

2,volatile
保证线程可见性:
MESI 缓存一致性协议保证不同CPU之间的缓存可见性

禁止指令重排序
双重校验锁中new的问题

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/354374.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号