可见性、有序性、原子性
可见性当一个线程对共享变量进行修改后另一个线程可以立即看到该变量修改后的最新值。有序性程序执行的顺序按照代码的先后顺序执行。原子性在一次或者多次操作时要么所有操作都被执行要么所有操作都不执行。synchronized关键字和Lock相关的工具类可以保证原子性、可见性和有序性volatile关键字可以保证可见性和有序性不能保证原子性。可见性synchronize、volatile 原子性synchronize可见性技术保障在Java中提供了多种可见性保障措施这里主要涉及四种volatile关键字标记内存屏障。synchronized关键字定义同步代码块或者同步方法。Lock接口。Atomic类型。synchronized 保证可见性是说的synchronized代码块的整体可见性。指在synchronized前后具有可见性而不是在synchronized之中具有可见性。进入同步块前线程清空自己的工作内存中关于共享变量的副本从主内存重新读取最新值。退出同步块后线程将工作内存中对共享变量的修改刷新回主内存确保其他线程可见。这一过程通过 monitorenter和monitorexit字节码指令实现这两个指令不仅用于加锁和解锁还隐含了 内存屏障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_column20421from20421
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2598787.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!