synchonized是一个字段
1.0之前太慢,重,jdk1.0后修改,变得轻.修改的原理是:以前是涉及到用户态和内核态的交互,现在是用户态实现。
基本概念理解:
用户态和内核态的概念:程序的不同级别。内核态级别更高,理解是操作权限更高,更贴近系统。
重量级:用户态到内核态申请;内核态再返回结果给用户态。
轻量级:都是在用户态实现的。
cas概念:是一种自偏锁,更是一种乐观锁的概念。当前值0;计算结果值1;会去看内存值是不是0,如果是,把1去更新内存值;2)如果发现,内存值是8,会重新读取一次,读到8,再计算计算结果得到9,再放入内存;
特殊场景cas中遇到ABA问题,即:有线程把数据从0改为8,又改回到0,和原来保持了一致;对于这种情况,加版本号去记录有过修改。
现在syn的实现是:先轻量级实现,不能实现,再重量级解决。
cas最终的原理:java层面,追踪到native方法上;追踪到c语言上,经过几层追寻,发现最后用的是lock cmpxchg(cmpxchg=cas修改变量值)
以Object对象为例子,对象的布局分为几个部分:
1)第一部分,叫markword,包含了锁信息,hashcode,gc信息;8bit
2)第二部分,是glasspoint,对象类型,4bit
3)成员变量
4)padding,为排列为8的倍数,空出来的部分
synchonized的优化:
视频去哪了呢?_哔哩哔哩_bilibili
############################################
双重检查锁(Dcl:double check lock:比如某个变量要安全操作,锁之前之后都要进行检查)要不要
happens-before原则,指定了重排序必须遵守的原则
volatile的解释 CSDN
最佳参考文章:
谈谈 JVM 内部锁升级过程 - 知乎
参考视频:
视频去哪了呢?_哔哩哔哩_bilibili
面试题
synchronized和volatile的区别