java面试题:讲一讲synchronized

1. synchronized用法

  1. 可修饰静态方法
  2. 可修饰实例方法
  3. 可修饰代码块

2. synchronized重量级锁原理

  1. synchronized对应的锁信息存储在对象头,对象头中会保存锁标志,线程ID等信息。 锁标志则标识当前是偏向锁,轻量级锁还是重量级锁。

先讲重量级锁:

  1. synchronized的重量级锁在字节码的层次表现为两条指令,分别是monitorenter和monitorexit。即在修饰代码块的前面加monitorenter,代码块的最后加monitorexit。
  2. 每执行一次monitorenter,对象头中的锁计数器就会加1,每执行一次monitorexit,锁计数器就会减1。只有锁计数器为0的时候,线程才可以获取当前的锁。
  3. 为了保证在方法异常完成时 monitorenter 和 monitorexit 指令依然可以正确配对执行,编译器会自动产生一个异常处理器,这个异常处理器声明可处理所有的异常,它的目的就是用来执行 monitorexit 指令。

3. synchronized锁升级过程

1.偏向锁

  • 线程第一次获取的时候会通过CAS操作将对象头的锁标志位变成偏向锁,并将对象头中的ThreadID改成自己的ID。
  • 锁就进入偏向模式之后如果没有其他的线程来争夺,当这个线程再次请求锁时,无需再做任何同步操作,即获取锁的过程。
  • 直到第二个线程也开始获取当前对象锁,并且当前线程没有释放锁的时候,就会升级为轻量级锁。

2.轻量级锁

  • 当前线程使用CAS将对象头的mark Word锁标记位替换为锁记录指针,如果成功,当前线程获得锁。
  • 如果失败,表示其他线程竞争锁,当前线程尝试通过自旋获取锁
  • 如果自旋成功则依然处于轻量级状态
  • 如果自旋失败,升级为重量级锁

3.重量级锁

刚刚已经讲过了原理过程

4. 可重入锁

synchronized是可重入锁,允许当前获取锁的线程再次获取,但是每次获取锁计数器都会加1。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值