Synchronized是关键字,可以修饰代码块,方法上,适用于写多读少的高并发场景,Synchronized在JDK6之后引入了锁升级机制,可以在不破坏线程安全的前提下,尽可能降低锁竞争带来的性能开销。Synchronized的实现原理是监视器,监视器中记录了三个区域,线程等待区,线程阻塞区,线程拥有者

锁升级的过程是无锁->偏向锁->轻量级锁->重量级锁

刚开始线程是无锁状态,当有线程开始尝试获取锁,此时锁升级为偏向锁,线程的ID会被记录在锁对象的对象头的MarkWord中,当下次该线程获取该锁,只需要比对线程的ID即可,就不用进行CAS操作,把加锁开销降到最低。如果有其他线程尝试获取锁,这时候偏向锁升级为轻量级锁,jvm在当前线程的栈帧中创建锁记录,通过CAS操作将对象头的Mark Word复制到锁记录,并将MarkWord指向锁记录地址。如果CAS成功,线程获取轻量级锁失败;如果失败,说明存在竞争,锁升级为重量级锁,重量级锁依赖操作系统的互斥量实现,线程竞争失败会被挂起,进入等待队列。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐