AI面试总结:克隆、浅拷贝和深拷贝
前言 简单记录一下Java面试中的克隆,已经对象的深拷贝和浅...
简单记录一下Java中synchronized的相关知识点,记录于此,方便自己查阅。
synchronized是 Java 内置的互斥同步机制,用来保证:
✅ 同一时刻,只有一个线程能执行被保护的代码
它解决的是:
锁的是当前实例对象(this)
public synchronized void method() { // 临界区 }
等价于:
public void method() { synchronized (this) { ... } }
锁Class对象
public static synchronized void method() { ... }
等价于:
public static void method() { synchronized (MyClass.class) { ... } }
✅ 锁的是Class对象
✅ 所有实例共享一把锁
synchronized (lockObject) { ... }
synchronized能保证原子性、可见性和有序性。
count++;这不是原子操作,等同于
#先加1 temp = count + 1 #然后赋值 count = temp
可以通过synchronized
synchronized (this) { count++; }
保证不会被中断
相当于隐式使用了主内存
只能对内部代码块有效!
Object object = null; synchronized (object) { //错误,运行后异常 }
运行时异常
Caused by: java.lang.NullPointerException: Null reference used for synchronization (monitor-enter)推荐:
private final Object lock = new Object();synchronized ("LOCK") { // 危险 }
虽然可以运行,但还是存在一些陷阱。
下面是不同做法的对比
| 做法 | 是否安全 | 说明 |
|---|---|---|
| synchronized ("order_lock") | ❌ 不安全 | 全局共享 |
| synchronized (UUID.randomUUID()) | ❌ 不安全 | 每次都不一样 |
| synchronized (new Object()) | ❌ 不安全 | 每次都是新锁 |
| ✅ private static final Object LOCK = new Object() | ✅ 正确 | 类级唯一 |
| ✅ private final Object LOCK = new Object() | ✅ 正确 | 实例级唯一 |
synchronized (a) {} synchronized (b) {}
不能保证哪个线程先执行,只能保证代码块内的顺序。
synchronized (a) { synchronized (b) {} }
✅ synchronized 是可重入的
❌ 但可能 死锁
synchronized void a() { b(); } synchronized void b() { }
✅ 同一线程可重复进入
✅ JVM 维护 锁计数器
synchronized 是 JVM 层面的互斥锁,基于 monitor,支持锁升级,保证原子性、可见性和基本的线程安全。