Synchronized的实现

文章详细介绍了Java中Synchronized关键字的四种锁状态——无锁、偏向锁、轻量级锁和重量级锁,以及其在对象头的MarkWord中如何存储锁状态。在不同状态下,锁的升级和降级策略确保了多线程环境中的线程安全。Synchronized通过设置对象头标志来实现锁的获取和释放。
摘要由CSDN通过智能技术生成

1.Synchronized的四种状态(优化)

  • 无锁状态:表示没有线程占用此锁。

  • 偏向锁:一个线程一直访问此同步代码,一种占用此锁,那么该线程就会自动获取锁,提高效率。

  • 轻量级锁:当锁是偏向锁时,此时又有其他的线程来抢占,就会升级为轻量级锁,未抢占到锁的线程就会通过自旋的形式尝试去获取锁,提高性能。

  • 重量级锁:当锁是重量级锁时,未抢占到锁的线程自旋到一定次数(对CPU消耗大),还未拿到锁时,就会升级为重量级锁,此线程会等待操作系统的调动,就不在主动的去抢占获取锁了

2.对象结构

Synchronized锁的状态存储在锁对象的对象头里,对象头中有一块区域为Mark Word,用于存储对象运行时的数据,比如:hashcode,GC次数,锁状态标识。32位操作系统Mark Word为32位,64位操作系统Mark Word为64位。

3.锁的具体实现

线程代码进入到Synchronized代码块时会自动获取锁对象,这时其他线程访问时会被阻塞,直到Synchroinzed代码块执行完毕或抛出异常,调用wait()方法都会释放锁对象。在进入Synchronized代码块时会将主内存的变量读取到自己的工作内存,在退出的时候会把工作内存的更新值写入到主内存。Java中Synchronized通过在锁对象的对象头设置标记,达到获取锁和释放锁的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值