原理比较好的理解方式:
一篇就够,synchronized原理详解_小派师兄的博客-优快云博客_synchronized原理
理解:
synchronized是一个锁,基于jvm内置锁实现,在字节码文件中通过monitor对象,基于进入与退出Monitor对象实现方法与代码块同步。具体情况,如果monitor进入数为0,线程可以进入,然后将monitor设置为1;如果该线程已经占有monitor,则进入数+1;如果没有占有,该线程阻塞等待,不断尝试获取,直到为0的时候获取成功。 监视器锁的实现依赖底层操作系统的Mutex lock(互斥锁)实现。
面试阐述:
1.说理解。
2.说锁对象,对象头上的2个机器码值的变更。
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的优化:
############################################
双重检查锁(Dcl:double check lock:比如某个变量要安全操作,锁之前之后都要进行检查)要不要
happens-before原则,指定了重排序必须遵守的原则
volatile的解释 优快云
最佳参考文章:
参考视频:
面试题