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