可见性、有序性、原子性
2026/5/9 22:09:23 网站建设 项目流程
  • 可见性:当一个线程对共享变量进行修改后,另一个线程可以立即看到该变量修改后的最新值。
  • 有序性:程序执行的顺序按照代码的先后顺序执行。
  • 原子性:在一次或者多次操作时,要么所有操作都被执行,要么所有操作都不执行。

synchronized关键字和Lock相关的工具类可以保证原子性、可见性和有序性,volatile关键字可以保证可见性和有序性,不能保证原子性。

可见性:synchronize、volatile 原子性:synchronize

可见性技术保障

在Java中提供了多种可见性保障措施,这里主要涉及四种:

  • volatile关键字标记内存屏障。
  • synchronized关键字定义同步代码块或者同步方法。
  • Lock接口。
  • Atomic类型。

synchronized 保证可见性

是说的synchronized代码块的整体可见性。指在synchronized前后具有可见性,而不是在synchronized之中具有可见性。

  • 进入同步块前‌:线程清空自己的工作内存中关于共享变量的副本,‌从主内存重新读取最新值‌。
  • 退出同步块后‌:线程将工作内存中对共享变量的修改‌刷新回主内存‌,确保其他线程可见。

这一过程通过 ‌monitorentermonitorexit字节码指令‌实现,这两个指令不仅用于加锁和解锁,还隐含了 ‌内存屏障(Memory Barrier)‌ 的作用:

  • monitorenter具有 ‌Load 屏障‌ 的效果,禁止其后的读操作被重排序到前面,并强制从主内存加载数据。
  • monitorexit具有 ‌Store 屏障‌ 的效果,强制将修改写回主内存,并禁止之前的写操作被重排序到后面。

这些行为符合 JMM 的 ‌happens-before 原则‌:对一个锁的解锁操作 happens-before 后续对同一锁的加锁操作 ‌‌。

synchronized 保证原子性

也是说的synchronized代码块的整体原子性。

与 volatile 对比

特性synchronizedvolatile
可见性✅ 保证✅ 保证
有序性✅ 通过互斥和 happens-before 保证✅ 通过内存屏障禁止重排序
原子性✅ 保证(整个同步块)❌ 不保证(如i++
性能开销较高(涉及线程阻塞/唤醒)较低(仅内存屏障)

synchronized是一种重量级但功能全面的同步机制。

总结

  • synchronized通过锁机制 + 内存屏障保证可见性‌。
  • 它确保:‌写操作在解锁前刷新到主内存,读操作在加锁后从主内存加载最新值‌。
  • 该机制是 Java 并发编程中实现线程安全和数据一致性的基础之一 ‌‌。

Java并发专题

https://cloud.tencent.com/developer/article/2342737?from_column=20421&from=20421

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询