本期说一下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多平台发布


周哥的offer秘籍
1 声望0 粉丝

23年硕士毕业半年被裁,一个月斩获大厂offer。面试经历50+,擅长校招社招求职笔试和面试全流程,擅长简历撰写。跟着周哥走,offer手里有!关注周哥不迷路!