interview
java-concurrency
Java的synchronized是怎么实现的?

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

相关问题

🦆
什么是死锁?如何避免死锁?

死锁是指两个或多个线程相互等待对方持有的锁而无法继续执行的情况。避免死锁的方法包括避免嵌套锁、使用锁超时机制、死锁检测算法等。

🦆
什么是线程安全?

线程安全是指在多线程环境下,多个线程同时访问某一资源时,不会出现数据不一致的情况。实现线程安全的方法包括使用同步机制(如 synchronized、Lock)、无锁编程(如使用原子类)、线程局部存储等。

🦆
volatile 关键字的作用是什么?

volatile 关键字用于修饰变量,保证了变量的可见性,即当一个线程修改了 volatile 变量的值,其他线程立即可见。同时,volatile 禁止指令重排序优化,保证了代码执行的顺序性。

🦆
什么是 CAS 操作?

CAS(Compare-And-Swap)是一种无锁的并发编程技术,它通过比较和交换的方式来实现原子操作。CAS 操作包括三个操作数:内存位置、预期值和新值。只有当内存位置的值等于预期值时,才会将其更新为新值。