我所理解的synchronized原理

了解的不多,请多见谅
众所周知,synchronized 是用来处理并发问题的。synchronized是锁住对象的,也就是说,A对象中有B和C两个方法,其中B方法加了synchronized关键字,我在调用B方法的同时,调用C方法,要等到B方法执行完成才能执行C方法,这里面涉及到锁的机制。
在jdk1.6之前,synchronized是会调用os的方法,这也就是被人们一直诟病的性能问题,在1.6之后,synchronized不在调用os方法,直接将问题在jvm层面解决,从而优化性能。(目前好像是变成了自适应锁?不太确定)
synchronized是如何锁住对象的呢?
其实说到底,无论是synchronized还是AQS都是改变某个值,当这个值在线程A修改后,线程B此时获取的值与原来不相同,那么就释放cpu,等待线程A执行完毕(线程A执行完毕后再修改为原来的值)。那么这个值在哪呢?这个值在对象头中。对象由,对象头,实例变量,对齐数据组成。(这三个数据加起来的大小必须是8bit的整数倍,对齐数据的大小是不固定的,举例来说,对象头15bit,实例变量24bit,那么对齐数据就是1bit)。
对象头是有什么构成的呢?
对象头由markword和klass point组成。
mark word:里面包含了对象的布局,类型,gc状态,同步状态,标识哈希码的基本信息。
klass point:有的人也叫做class metaData address ,告诉jvm,这是哪个类的实例对象。
在64bit计算机中,markword的组成如下:
unused(25) hash(31) unused(1) age(4) biased-block(1) lock(2)
其中age 代表了该对象经历的ygc的次数,这也就是为什么在经历了15次ygc后,会将对象放入老年代。
对象在使用synchronized关键字后,对象具有5中状态,分别是:
1.无(锁)状态
2.偏向锁 :biased-block
3.轻量锁
4.重量锁
5.gc状态
所以,用了后3位来代表对象的状态。

也就是说,在线程A获取到对象后,修改了对象头中的markword的后三位的状态,使得其他线程试图获取对象时失败(因为该对象不是无锁状态)。

正处于实习阶段,有不对的地方欢迎大家指正。
2019-11-20

2020-1-8
补充一点:sychronized的生命周期是在jvm里的,在分布式的情况下是不会起作用的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值