Java并发面试题, Java 的 synchronized 是怎么实现的?
Java并发面试题, Java 的 synchronized 是怎么实现的?
QA
Step 1
Q:: Java 的 synchronized 是怎么实现的?
A:: Java 中的 synchronized 是通过对象内部的一个叫做监视器锁(monitor lock 或 intrinsic lock)来实现的。当一个线程进入一个 synchronized 方法或块时,它会获取该对象的监视器锁,而其他线程无法再进入同一个对象的任何 synchronized 方法或块。synchronized 锁定的是对象而不是代码块,保证了同一时间只有一个线程可以执行这些受 synchronized 保护的代码,从而实现了线程的互斥访问。
Step 2
Q:: synchronized 和 ReentrantLock 有什么区别?
A:: synchronized 是 Java 内置的关键字,使用简单,自动获取和释放锁。ReentrantLock 是在 java.util.
concurrent 包中引入的一个锁,提供了更多的灵活性和功能,如尝试获取锁、超时获取锁、可以被中断获取锁、支持公平锁等。
Step 3
Q:: synchronized 的底层原理是什么?
A:: synchronized 的底层实现依赖于 JVM 中的对象头(Object Header)中的锁标志位和 monitor 机制。具体来说,当一个对象被加锁时,JVM 会将该对象的对象头中的锁标志位修改为标识锁的状态,同时关联到当前线程。对于重入锁,还会有一个计数器来记录重入的次数。
Step 4
Q:: synchronized 是可重入锁吗?
A:: 是的,synchronized 是可重入锁。这意味着同一个线程可以多次进入由 synchronized 保护的代码块或方法,而不会发生死锁。每次重入锁时,锁计数器会递增,退出时会递减,直到计数器为 0
时锁才会被释放。
用途
面试 synchronized 相关的内容是因为它是 Java 并发编程中最基础和常用的同步机制之一。在实际生产环境中,当多个线程需要访问共享资源时,需要保证这些访问是线程安全的。synchronized 能够保证在同一时间只有一个线程能够执行某段关键代码,从而避免数据不一致的问题。\n相关问题
🦆
什么是死锁?如何避免死锁?▷
🦆
什么是线程安全?▷
🦆
volatile 关键字的作用是什么?▷
🦆
什么是 CAS 操作?▷