`

Java并发编程之验证volatile的可见性

 
阅读更多

Java并发编程之验证volatile的可见性

通过系列文章的学习,凯哥已经介绍了volatile的三大特性。1:保证可见性 2:不保证原子性 3:保证顺序。那么怎么来验证可见性呢?本文凯哥将通过代码演示来证明volatile的可见性。

前期准备:

共享变量 number 初始值是0,然后修改后的值为100;

两个线程,分别是:主线程Main以及线程名为A的线程

内部类:

 

可以看到有个方法将变量值修改成了100;

再来看看:

 

说明:

变量number不用volatile关键字修饰。主线程在运行后,启动子线程。名字为线程A。然后线程A将变量number的值修改成了100后,主线程对number的进行判断。如果numbr的值等于0的时候,就一直while循环。我们预期下结果:线程A修改完数据之后,输出的是100呢还是0呢?最后运行结束这个是否会输出呢?

我们来看看输出的结果:

编辑

可以看到控制台输出的结果,线程A更新完变量的值之后在自己内部获取到变量的值是更新后的,但是在主线程的工作缓存去获取后,依然是0.因为主线程依然还在运行着(红色按钮一直红色的),虽然线程A修改了共享变量的值,但是没有人通知主线程你获取的数据需要更新。这说明,在不用volatile修饰的时候,共享变量在线程A和主线程之间是不可见的。

我们再来试试使用volatile修饰共享变量后运行的结果。

使用volatile修饰变量

volatile int number = 0;

再来查看运行结果:

线程A 进入了。准备操作数据

线程A 更新数据完成。更新后的值为:100

==============main====运行结束.主线程Main获取到的值为:100

 

结论:

我们可以看到,运行结束语句也输出了。并且主线程获取到number的值就是修改后的100.

这次操作和上次操作唯一区别就是变量number添加了volatile关键字来修饰,但是主线程竟然能够获取到线程A修改后的数据,从而证明了volatile能够保证共享变量在其他线程的可见性。

Volatile第二个特性:不保证原子性的证明,欢迎继续学习凯哥【凯哥Java:kaigejava】下一篇文章《Java并发编程之验证volatile不能保证原子性》。

 

0
2
分享到:
评论

相关推荐

    Java并发volatile可见性的验证实现

    在Java并发编程中,volatile关键字扮演着非常重要的角色,它可以确保变量的可见性和原子性。在多线程环境下,volatile关键字可以确保变量的修改对其他线程是可见的。本文将通过示例代码详细介绍Java并发volatile可见...

    汪文君高并发编程实战视频资源下载.txt

    │ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...

    Java并发编程实战

    Java并发编程实战 本书深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及...

    Java并发编程培训(阿里巴巴)

    2:确保引用对象的可见性; 3:标示重要的生命周期的事件,例如:开始或者关闭。 脆弱的volatile的使用条件: 1:写入变量不依赖变量的当前值,或者能够保证只有单一的线程修改变量的值; 2:变量不需要和其他变量...

    java设计模式以及并发编程大全

    通过学习《JAVA并发编程实践.pdf》,你将能够掌握如何使用Java提供的并发工具,编写出高性能、低延迟的多线程程序,同时避免并发编程中的陷阱和错误。 总之,Java设计模式和并发编程是Java开发的两大基石,它们...

    汪文君高并发编程实战视频资源全集

    │ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...

    java并发编程艺术源码-The-Art-of-Java-Concurrency-Programming:Java并发编程的艺术

    3. **同步机制**:Java提供了`synchronized`关键字和`volatile`关键字来保证线程之间的可见性和互斥访问。此外,`ReentrantLock`等高级锁也是线程安全的关键。 4. **并发容器**:`ConcurrentHashMap`、`...

    Java并发编程实践-电子书-05章.pdf

    ### Java并发编程实践——第5章 数据冲突及诊断工具MTRAT #### 5.1 如何避免数据冲突 在并发编程中,数据冲突是指多个线程对同一资源的访问而导致的问题,这些问题可能会破坏程序的一致性和正确性。为了避免数据...

    Java高并发编程与JVM性能调优实战 视频教程 下载下载因为太大存百度云盘4.zip

    3. **JVM内存模型**:了解Java内存模型(JMM)的工作原理,理解主内存、工作内存的概念,以及 volatile、synchronized 关键字在内存可见性中的作用。 4. **垃圾收集与内存管理**:深入理解JVM的垃圾回收机制,包括...

    并发编程,学习手记.pdf

    Java并发编程主要涉及以下几个方面: 1. **Java内存模型(JMM)**:JMM定义了线程如何访问和修改共享变量的规则,确保在并发环境下数据的一致性和可见性。它涉及到缓存一致性、指令重排等问题,以确保正确性。 2. ...

    Java安全性编程实例.

    使用volatile关键字可以确保共享变量在多线程环境中的可见性。此外,还可以使用java.util.concurrent包下的工具类,如Semaphore、CyclicBarrier和ExecutorService等,来更好地管理和控制并发。 四、异常处理 在安全...

    通过volatile验证线程之间的可见性

    本篇文章将深入探讨如何通过`volatile`关键字验证线程之间的可见性,并通过示例代码详细解释其工作原理。 首先,我们需要理解Java内存模型(JMM)。在JMM中,存在两种内存区域:主内存和工作内存。主内存是所有线程...

    volatile学习手册

    总结,volatile是Java并发编程中不可或缺的一部分,它提供了一种相对轻量级的同步机制,解决了数据可见性的问题,但在处理需要原子性的操作时需要额外的同步措施。理解并合理使用volatile,可以帮助开发者编写出更加...

    Java 并发包下源码阅读与自己的测试

    - **线程可见性和有序性**:确保正确使用`synchronized`、`volatile`关键字保证内存可见性和有序性。 - **线程安全的验证**:可以使用`ThreadLocalRandom`代替`java.util.Random`,或者使用`AtomicInteger`替代`int`...

    实战JAVA高并发程序设计—源代码

    9. **Java内存模型(JMM)**:理解JMM对于理解`volatile`和`synchronized`的作用以及线程之间的数据可见性至关重要。 10. **并发性能优化**:通过合理设置线程池大小、减少锁的粒度、使用无锁数据结构等方式,提升...

    Java语言编程规范--华为技术有限公司

    - 使用volatile保证多线程环境中的可见性和有序性。 9. **代码复用**: - 遵循DRY(Don't Repeat Yourself)原则,避免重复代码。 - 使用继承、接口和组合来重用和扩展代码。 10. **测试规范**: - 编写单元...

    Java编程规范-动力节点共9页.pdf.zip

    14. **并发编程**:了解Java的并发工具,如synchronized、volatile、ThreadLocal和并发容器,以编写线程安全的代码。 15. **异常处理**:避免使用空catch块,提供有用的异常信息,避免使用异常进行流程控制。 以上...

    java陷阱常见面试题

    4. 并发问题:线程安全是Java并发编程的核心,理解synchronized、volatile和Atomic类的使用可以避免竞态条件和死锁。 5. 类加载器:不恰当的类加载可能导致类冲突,理解双亲委派模型有助于避免这类问题。 二、Java...

    effective enterprise java 中文版

    书中详细介绍了synchronized关键字的用法、线程安全的集合类,以及如何使用volatile变量确保可见性。此外,还讨论了Future和ExecutorService等并发工具类的使用。 4. **JVM优化**:理解JVM的工作原理有助于提升应用...

Global site tag (gtag.js) - Google Analytics