synchronized锁是对象的运行时身份标识,克隆只复制字段不复制monitor,新对象拥有独立初始未锁定的锁。
java 中 synchronized 的对象锁 不会被克隆,无论是浅拷贝还是深拷贝,锁状态都不参与克隆过程。
这是因为对象锁(monitor)是 JVM 在运行时为每个 Java 对象动态关联的同步机制,它属于对象的运行时元数据,不存储在对象实例字段中,也不在内存复制范围内。clone() 方法(包括 Object.clone() 的 native 实现)只按位复制对象实例的字段值(基本类型值 + 引用地址),而完全不涉及 monitor、锁计数器、线程持有关系等 JVM 内部状态。
为什么克隆后锁状态不继承?
- 锁是“与对象绑定的运行时资源”,不是对象的数据成员
-
super.clone()分配新内存、复制字段,但不调用构造方法,也不初始化 monitor - 克隆出的新对象在首次被
synchronized使用时,JVM 会为其新建独立的 monitor(初始锁计数为 0,无持有线程)
✅ 举例:
class Counter { private int value = 0; public synchronized void inc() { value++; } } Counter c1 = new Counter(); // 假设当前线程已进入 c1.inc(),c1 被加锁(monitor 计数=1) Counter c2 = (Counter) c1.clone(); // 浅克隆成功 // 此时 c2 的 monitor 是全新、未锁定的 // 另一个线程可立即进入 c2.inc(),与 c1 的锁互不影响
浅拷贝对锁相关行为的实际影响
- ✅ 克隆对象拥有独立的锁:
synchronized(c1)和synchronized(c2)完全无关 - ✅ 修改克隆对象的字段值不影响原对象的锁行为(因字段已分离)
- ⚠️ 若原始对象和克隆对象共享某个引用字段(如
List、Date等可变对象),而该共享对象本身被synchronized使用,则需额外注意——但这属于共享数据的并发问题,和克隆对象自身的锁无关
? 关键区分:
Alibabacloud Sdk Client Initialization For Java下载在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
synchronized(obj)锁的是obj这个对象实例本身(即它的 monitor)- 克隆得到的是另一个对象实例 → 自然对应另一个 monitor
- 即使两个对象字段内容相同、甚至某些引用指向同一对象,它们的锁仍是隔离的
常见误解澄清
- ❌ “浅拷贝复制了引用,所以也复制了锁” → 错。引用复制 ≠ 锁复制
- ❌ “克隆后
c2.wait()会唤醒在c1上等待的线程” → 错。wait/notify作用于各自 monitor - ❌ “
clone()后需要手动重置锁状态” → 不需要,也没有接口可以重置或复制锁状态
总结一句话
synchronized 锁是对象的运行时身份标识之一,克隆操作只复制数据快照,不复制执行上下文;每个对象——无论是否克隆而来——都自带一块干净、独立、未被任何线程持有的锁。
立即学习“Java免费学习笔记(深入)”;


















