本期说一下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’更快的线程本地变量支持。
- wait()、notify() 和 notifyAll() 方法与对象的监视器锁直接相关。只有线程持有了对象的监视器锁,才有资格调用这些方法,否则就会抛出java.lang.IllegalMonitorStateException
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多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。