多线程JUC 第2季 synchronized锁升级过程

一 synchronized的概述

1.1 synchronized的特性

用锁能够实现数据的安全,但是会代理性能下降。Synchronized是一个重量级锁,锁的升级过程:无锁->偏向锁->轻量级锁->重量级锁。

1.2  synchronized锁性能低效原因

在java中早期版本中,synchronized属于重量级锁,效率低下,因为监视器monitor是依赖于底层操作系统的Mutex Lock(系统互斥量)来实现的。挂起和唤醒线程,需要做用户态和内核之间的切换时间成本相对较高。java6后,为了减少获得锁和释放锁所带来的性能消耗,引入轻量级锁和偏向锁。

多线程JUC 第2季 synchronized锁升级过程_第1张图片

1.3 monitor作用

多线程JUC 第2季 synchronized锁升级过程_第2张图片 1.4 ObjectMonitor的作用

多线程JUC 第2季 synchronized锁升级过程_第3张图片

 1.5 synchronized的升级流程

synchronized使用锁存储在java对象头部里的mark down字段里,锁升级主要依赖于markdown中的锁标志位和释放偏向锁标志位。

1.偏向锁:markdown存储的是偏向的线程id;

2.轻量锁:markdown存储的是指向线程栈中Lock Record的指针。

3.重量锁:markdown存储的是指向堆中的monitor对象的指针

多线程JUC 第2季 synchronized锁升级过程_第4张图片

二  无锁状态

2.1 介绍

1.结构: 前两行为8字节;后一行为类型指针4字节。

多线程JUC 第2季 synchronized锁升级过程_第5张图片 2.读取流程多线程JUC 第2季 synchronized锁升级过程_第6张图片3.结论:无锁状态,一个对象被实例化后,如果还没有被任何线程竞争锁,那么它为无锁状态(001)

多线程JUC 第2季 synchronized锁升级过程_第7张图片

三 偏向锁

3.1 

多线程JUC 第2季 synchronized锁升级过程_第8张图片 

你可能感兴趣的:(高并发多线程,java,开发语言)