Java多线程之synchronized关键字

作用
synchronized保证多线程中只有一个线程能获取到资源的锁,并且获取到资源的锁的线程才会执行同步代码,执行完毕后会释放资源锁。

synchronized用在
类方法上(锁住的资源为当前class对象,即调用该类方法时需获取class对象锁)
普通方法上(锁住的资源为当前对象,即调用该普通方法时,需获取当前对象锁)
对象(普通对象,class对象)(锁住的资源为对象,获取锁才能进入代码块)

原理
简单些来说线程执行CPU指令,CPU指令操作内存,要实现在多线程中进行同步,那么需要在多线程共享内存中设立标识,比如标识什么情况下执行什么指令,那么获取锁就执行标识判断对应的指令。

Java中的对象在堆中存放的连续数据包括:对象头,实例数据和填充数据,synchronized主要是对对象头数据进行操作。
对象头的数据包括:Mark Word,class pointer和array length(对象是一个数组的时候才设立)

Mark Word根据锁类别呈现不同的数据类型
Mark Word
自JDK1.6之后,JVM对synchronized关键字进行了优化,采取锁优化机制,偏向锁->轻量锁->重量级锁
偏向锁:通过线程Id进行对比,如果线程Id没变,则直接获得锁
轻量级锁:基于CAS指令,尝试通过短暂自旋获得锁,会消耗CPU时间
synchronized膨胀为重量级锁后,对于方法基于标识ACC_SYNCHRONIZED,对于代码块基于MONITORENTER和MONITOREXIT两个指令,不会消耗CPU时间,但线程会进入阻塞状态,性能低。

一般来说synchronized锁是不可以进行锁降级的,即对象的MarkWord中标记为重量级锁后,其余线程不会再执行锁升级过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值