解锁Synchronized的奥秘:从原理到场景,再到锁升级全攻略!

本期说一下Synchronized的相关面试题。

Synchronized的作用或者说一般用在什么场景?

原子性:确保线程互斥的访问同步代码

可见性:保证共享变量的修改能够及时可见。

有序性:有效解决指令重排问题。

说一下Synchronized的原理?

答:

  • 每个java对象都有一个与之相关联的监视器(monitor,底层在JVM中基于C++实现),监视器是一种内部锁或互斥锁。

  • 使用Synchronized可以获取对象的监视器锁,从而创建临界区(monitorenter和monitorexit包围的指令范围),确保在同一时刻只有一个线程能够进入执行。

    • 示例代码
public class Example {
    private Object lock = new Object();//

    public void synchronizedMethod() {
        synchronized (lock) {
            // 临界区,只有一个线程能够执行这里的代码
            // ...
        }
    }
}
  • 拓展
    • wait()、notify() 和 notifyAll() 方法与对象的监视器锁直接相关。只有线程持有了对象的监视器锁,才有资格调用这些方法,否则就会抛出java.lang.IllegalMonitorStateException FasfThreadLocal是Netty框架中的一个类,用于提供比标准‘ThreadLcoal’更快的线程本地变量支持。

Synchronized是如何进行锁升级的?

答:

  • 无状态锁

    • 初始状态,对象没有被任何线程锁定。当线程尝试进入synchronized块时,会尝试获取对象的锁。
  • 偏向锁(Biased Locking)

    • 在程序刚启动时,锁处于偏向锁状态。这时候,如果某个线程获取了锁,那么在一段时间内,该线程再次获取这个锁时,无需竞争,直接获得。这减少了锁竞争的开销。

    • 偏向锁通过记录获取锁的线程ID,如果有其他线程尝试获取该锁,则需要撤销偏向锁,升级为轻量级锁。

  • 轻量级锁(Lightweight Lock)

    • 当多个线程竞争同一个锁时,偏向锁就会升级为轻量级锁。轻量级锁使用CAS操作(Compare and Swap)来尝试获取锁,而不是直接阻塞线程。

    • 如果CAS操作失败,说明有竞争,这时候锁会升级为重量级锁。

  • 重量级锁(Heavyweight Lock)

    • 当锁升级到重量级锁时,会导致其他线程阻塞,只能等待持有锁的线程释放锁。

    • 重量级锁的实现使用操作系统提供的互斥量(Mutex)等机制,具有较大的性能开销。

  • 这种锁升级机制是为了在不同情况下权衡性能和资源占用。偏向锁适用于大多数情况下是单线程获取锁的场景,而轻量级锁和重量级锁适用于多线程竞争锁的情况。这样的设计可以在不同场景下提供更好的性能。

Synchronized是JVM层面还是JDK层面的锁?

答: synchronized是 Java 中的关键字,用于实现同步。它在 Java 中是基于监视器(Monitor)的概念实现的,因此可以说是在 JVM 层面提供的锁。

  • "JVM 层面锁"通常指的是在 Java 虚拟机(JVM)内部提供的锁机制
  • "JDK 层面锁"通常指的是在 Java 开发工具包(JDK)中提供的高级锁机制,这些锁位于 java.util.concurrent 包下

以上内容出自本人整理的面试秘籍。 链接: https://pan.baidu.com/s/1o014Ems8diV0D3h8K15olA?pwd=fi3x 提取码: fi3x 复制这段内容后打开百度网盘手机App,操作更方便哦

工作日每天更新,周末随缘更新。

请关注我,以便及时获取最新内容哦!

本文由 mdnice 多平台发布

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值