作者:CoderW
volatile是什么
volatile是Java的一个关键字。
它提供的一种轻量级同步机制,能够保证可见性和有序性,但是不能保证原子性
可见性
对于volatile的可见性,先看看这段代码的执行
- flag默认为true
- 创建一个线程A去判断flag是否为true,如果为true循环执行i++操作
- 两秒后,创建另一个线程B将flag修改为false
- 线程A没有感知到flag已经被修改成false了,不能跳出循环
这相当于啥呢?
相当于你的女神和你说,你好好努力,年薪百万了就嫁给你,你听了之后,努力赚钱。3年之后,你年薪百万了,回去找你女神,结果发现你女神结婚了,她结婚的消息根本没有告诉你!难不难受?
女神结婚可以不告诉你,可是Java代码中的属性都是存在内存中,一个线程的修改为什么另一个线程为什么不可见呢?
这就不得不提到Java中的内存模型了,Java中的内存模型,简称JMM,JMM定义了线程和主内存之间的抽象关系,定义了线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存中存储了该线程以读/写共享变量的副本,它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。
注意!JMM是一个屏蔽了不同操作系统架构的差异的抽象概念,只是一组Java规范。
了解了JMM,现在我们再回顾一下文章开头的那段代码,为什么线程B修改了flag线程A看到的还是原来的值呢?
- 因为线程A复制了一份刚开始的flage=true到本地内存,之后线程A使用的flag都是这个复制到本地内存的flag。
- 线程B修改了flag之后,将flag的值刷新到主内存,此时主内存的f