线程安全-1 synchronized&锁升级

一.说一下synchronized关键字的底层原理

1.synchronized又叫同步锁,采用互斥的方式使同一时刻只能有一个线程持有锁。

2.jdk1.6及以前,synchronized底层是用monitor实现的。monitor是jvm级别的对象,由c++实现。每一个对象对应一个monitor,线程要获取锁需要通过一个对象去关联其monitor,由这个对象来充当锁介质,因此又叫对象锁。

3.monitor由三部分组成

(1)owner:关联当前持有锁的线程。同一时刻只能有一个线程持有锁。

(2)EntryList:关联所有没有竞争到锁的线程。当一个线程释放锁,会唤醒EntryList中所有线程一起争抢锁,与阻塞的先后顺序无关,因此是一种非公平锁。

(3)WaitSet:关联所有持有锁后调用wait()进入等待状态的线程,这些线程进入等待状态后会释放锁,等待被唤醒。

二.线程获取锁是如何通过对象关联monitor的?

1.在HotSpot虚拟机中,对象在内存的存储可分为三部分:

(1)对象头Header:Header又分为两部分

        a.MarkWord:存储对象自身运行时的数据,如HashCode、分代年龄、锁标识等。

        b.KlassPoint:存储指向对象数据类型的指针。

        c.如果对象是一个数组,则还会有第三部分存储数组的长度。

(2)实例数据InstanceData:存储对象数据,如成员变量等。

(3)填充数据PaddingData:如果对象头加实例数据的长度不是8的整数倍,则会用填充数据填到8的整数倍,为无意义数据。

2.Java中每个对象会关联一个Monitor对象,如果当前线程使用synchronized给对象上锁,且是重量级锁,则该对象的MarkWord会存储指向其Monitor对象的指针,线程通过该指针关联到其Monitor。

三.Monitor实现的锁是重量级锁,说一下锁升级机制

1.synchronized实现的锁都是可重入的,锁的状态可分为四种:

(1)无锁

        a.对象未被synchronized上锁,则是无锁状态。

        b.MarkWord存对象的HashCode、分代年龄、偏向锁标识、锁状态。

(2)偏向锁

        a.很长一段时间内,该锁只会被一个线程使用,则使用偏向锁。

        b.对于偏向锁,线程第一次上锁会通过CAS操作使对象的MarkWord关联线程id,后续线程对该锁的每次重入都只要比较线程id即可,无需再进行CAS操作。即多次重入仅进行一次CAS操作。

        c.MarkWord存锁关联的线程id、时间戳epoch、分代年龄、偏向锁标识、锁类型标识。

(3)轻量级锁

        a.如果该锁被多线程使用,但不同线程的加锁时间基本是错开的,即多线程对于锁的竞争不激烈,则使用轻量级锁。

        b.对于轻量级锁,线程第一次上锁会通过CAS操作使对象的MarkWord关联线程的锁记录路,后续的每次重入也要进行CAS操作,即每次重入都要进行一次CAS操作。

        c.MarkWord存 指向线程栈中锁记录的指针、锁类型标识。

(4)重量级锁

        a.如果该锁被多线程竞争使用,则使用重量级锁。

        b.重量级锁是通过Monitor实现的,而Monitor是jvm层面的对象,而jvm又是系统级别的,属于内核态。因此每次操作锁都要涉及到用户态和内核态的切换、进程上下文的切换,成本高性能低。

        c.MarkWord关联 指向Monitor对象的指针、锁类型标识。

2.锁升级机制

(1)对象被创建出来,未被synchronized加锁,此时属于无锁状态。

(2)当线程第一次执行到synchronized代码块,给对象加锁,此时无锁升级为偏向锁,意为偏向于第一个加锁的线程的锁。若一直只有该线程使用该锁,则该锁一直是偏向锁。

(3)当锁是偏向锁时,如果被其他线程访问,则偏向锁升级为轻量级锁。轻量级锁情况下,未竞争到锁的线程不会进入阻塞,而是会进入自旋。

自旋:线程不断重复未成功的操作,直至成功。若一直未成功,则一直重复失败操作,直至成功为止,因此又称为自旋锁

(4)当轻量级锁中的某个线程自旋次数达到设置的最大自旋次数时,表明锁竞争激烈,此时轻量级锁升级为重量级锁。

轻量级锁情况下:若线程未竞争到锁,不会释放cpu,而是会自旋,空耗cpu时间片,直到成功竞争到锁。

重量级锁情况下:若线程未竞争到锁,则进入阻塞,释放cpu。;当锁被释放时,由操作系统唤醒该线程。

上述四种状态随着锁竞争的激烈程度不断升级,构成锁的升级。锁的升级是不可逆的,只能升级不能降级。

     

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值