Synchronized锁详解

Synchronized锁详解

1. 前言
sync锁是JVM自带的锁,自动加锁,自动解锁,不同于lock锁,sync锁能修饰方法、变量、代码块等,下面

2. sync的锁升级过程
new - 偏向锁 - 轻量级锁 (无锁, 自旋锁,自适应自旋)- 重量级锁
jdk1.5之前,sync是重量级锁,如果要使用sync的话,他首先会去操作系统去申请一把大锁,但是在之后,sync进行了锁优化,第一个访问这把锁的线程,它会在对象的markword中做一个标记,这就是偏向锁,如果有多个线程去访问资源的时候,他会将偏向锁撤销,换成轻量级锁,如果竞争加剧,那么他就会向操作系统去申请一把重量级锁

3. sync的原理
sync是Java实现同步互斥的一种方式,他会在对象的markword做标记,被sync修饰过的代码块,在被编译的过程中,会生成minitorEnter和minitorExit两个字节码指令,当虚拟机运行到minitorEnter的时候,会尝试获取该对象的锁,如果对象还没加锁或者已经获取到该对象的锁,那么锁计数器就会加一,如果没有获取到对象的锁的话,那么该线程就会阻塞,直到锁被另一个线程释放,当虚拟机运行到minitorExit的时候,锁就会被释放,sync锁实际上实在对象头中添加标记实现的
4. sync是如何确定锁对象的
主要是miniterEnter和miniterExit两个字节码指令中referece对象,即加锁和解锁的对象,使用sync可以修饰不同的对象,因此,锁可以这样确定:
明确指定加锁对象的,比如:sync(this)、sync(T.class);那么,加锁对象即该对象
没有明确指定加锁对象的,分为两种:一种是静态,那么加锁对象就是该类的对象,一种是非静态:那么加锁对象就是当前对象
5. sync不一定比自旋锁慢
如果线程数少,运行时间短的话,那么自旋锁确实比sync锁快的,但是如果自旋的时间太长,线程数又多的话,那么这时候,自旋锁就不占优势了,用自旋锁的话,有很多线程就会占用cpu的资源,这是很不明智的,这时候就需要sync锁,它将线程加入到等待队列中,不需要需要cpu资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值