synchronized通过JVM的monitor机制实现加锁,从原子性、可见性、有序性三方面保障线程安全;它将临界区变为不可分割单元,防止“读—改—写”操作因交错执行导致数据丢失。

synchronized 通过加锁机制,强制对共享资源的访问串行化,从原子性、可见性、有序性三个层面保障多线程数据安全。它不是靠语法糖,而是依托 JVM 的 monitor 和内存模型约束来落地。
锁住临界区,确保操作原子性
多个线程对共享变量做“读—改—写”(如 count++)时,该操作实际分三步:读取值、计算新值、写回内存。若不加控制,线程可能交错执行,导致结果丢失。
- synchronized 将整个代码块或方法变成不可分割的执行单元;
刷新主内存,保证修改对其他线程可见
每个线程有自己的工作内存,可能长期缓存旧值。synchronized 在锁的边界处强制同步变量状态:
插入内存屏障,禁止指令重排破坏逻辑顺序
CPU 和编译器为优化性能可能调整指令顺序,但在并发下易引发逻辑错乱。synchronized 在加锁和解锁位置插入内存屏障:
锁对象选对了,安全才真正生效
锁的安全效果完全取决于是否用对了锁对象——锁错了,等于没锁:
- synchronized 锁的是 this,只保护当前对象的状态;
- synchronized 锁的是 类.class,用于全局共享变量;
- new Object()、String 或 Integer 等可变或被缓存的对象作锁,否则可能锁不住。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











