zoukankan      html  css  js  c++  java
  • 浅谈 volatile 的实现原理

    在并发编程中我们一般都会遇到这三个基本概念:原子性、可见性、有序性。我们稍微看下volatile

    原子性

    原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行;即使在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程所干扰,如 int a = 0

    原子性就像数据库里面的事务一样,他们是一个团队,共同进退,同生共死。

    在单线程环境下我们可以认为整个步骤都是原子性操作,但是在多线程环境下则不同,Java只保证了基本数据类型的变量和赋值操作才是原子性的(注:在32位的JDK环境下,对64位数据的读取不是原子性操作*,如long、double)。要想在多线程环境下保证原子性,则可以通过锁、synchronized来确保

    volatile是无法保证复合操作的原子性

    可见性

    可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

    在上面已经分析了,在多线程环境下,一个线程对共享变量的操作对其他线程是不可见的。

    Java提供了volatile来保证可见性。

    当一个变量被volatile修饰后,表示着线程本地内存无效,当一个线程修改共享变量后他会立即被更新到主内存中,当其他线程读取共享变量时,它会直接从主内存中读取。 
    当然,synchronize和锁都可以保证可见性。

    有序性

    有序性:即程序执行的顺序按照代码的先后顺序执行。

    Java提供volatile来保证一定的有序性。

    总结:volatile具有可见性和有序性的特点,一般用于多线程中。

    注意:static 是指该类的每个实例都能访问同一个static属性,该属性被该类的所有实例共享,它是唯一的。这东西和线程没关系。volatile 可以保证线程间的可见性

  • 相关阅读:
    基于边缘计算网关的桥梁结构安全监测应用
    5G工业网关的边缘计算
    5G工业网关和5G工业路由器差异对比分析
    大型网站架构系列:消息队列(二)
    大型网站架构系列:分布式消息队列(一)
    [转]线程安全类的设计
    [转]runloop原理
    [转]深入理解RunLoop
    [转]iOS保持界面流畅的技巧和AsyncDisplay介绍
    [转]面试时如何优雅的谈论OC
  • 原文地址:https://www.cnblogs.com/liuqing576598117/p/9855235.html
Copyright © 2011-2022 走看看