volatile是JVM提供的一种最轻量级的同步机制,因为Java内存模型为volatile定义特殊的访问规则,使其可以实现Java内存模型中的两大特性:可见性和有序性。这篇文章主要介绍了Java多线程之volatile关键字及内存屏障,需要的朋友可以参考下 gleton(); } } } return instance; }}在这个单例模式的实现中,如果没有使用volatile修饰instance,那么在多线程环境下可能会出现问题。由于`new Singleton()`包含多个操作(分配内存、调用构造函数、设置引用),JVM为了优化可能会对这些操作进行指令重排。如果两个线程同时执行`getInstance()`,线程A可能先看到instance不为空(因为构造函数还没执行完,但是内存分配已完成),然后线程B也检查到instance不为空,但此时instance其实还没有完全初始化。这样就会导致线程安全问题。而如果使用volatile修饰instance,JVM会禁止对instance的读写操作进行指令重排,保证了在多线程环境下的正确性。 内存屏障的概念内存屏障,也称为内存栅栏,是CPU或编译器用来限制特定操作的指令,它可以保证特定操作的顺序,以及保证某些数据的可见性。在Java中,volatile关键字的实现就依赖于内存屏障。内存屏障分为写屏障和读屏障,它们分别确保写操作和读操作的顺序性。 volatile的内存屏障作用: 1. 写屏障(Store Barrier):在写操作之后插入写屏障,确保写操作的数据立即写入主内存,其他线程可以立即看到这些更新。 2. 读屏障(Load Barrier):在读操作之前插入读屏障,确保读操作会从主内存中获取最新值,而不是使用工作内存中的旧值。 volatile的内存屏障在Java内存模型中起到以下作用: 1. 确保可见性:写屏障保证了当一个线程修改volatile变量后,其他线程能立即看到这个修改。写操作后,工作内存中的副本不会被使用,而是直接将新值写入主内存,其他线程在读取时会从主内存中获取最新值。 2. 禁止指令重排:读屏障保证了volatile变量的读操作不会被重排序到其后面的读写操作之前,写屏障则确保了不会被重排序到其前面的读写操作之后。这保证了volatile变量的有序性,防止出现因指令重排导致的问题。 总结来说,volatile关键字在Java多线程编程中起着关键作用,它提供了轻量级的同步机制,通过内存屏障保证了变量的可见性和有序性,避免了多线程环境下数据不一致的问题。但需要注意的是,volatile不能保证操作的原子性,对于需要原子操作的场景,如计数器等,仍然需要使用synchronized或其他同步机制。在设计多线程程序时,理解volatile的工作原理和限制是非常重要的。
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/release/download_crawler_static/12748997/bg1.jpg)
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
- 粉丝: 9
- 资源: 916
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)