• 浅谈 volatile 的实现原理


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

    原子性

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

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

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

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

    可见性

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

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

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

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

    有序性

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

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

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

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

  • 相关阅读:
    使用Xcode 制作自定义storyboard启动界面,供uniAPP使用。
    由于ios由UIWebView换成了WKWebview内核后导致webview请求接口文件上传,后台接收不到文件
    标准基座获取定位可以获取address城市,自定义基座获取不到address
    WeeklyEnglish 2020
    Maven编译打包时报“PKIX path building failed”异常解决方法
    Spring Security
    在IDEA中导入GIT项目
    利用git上传本地文件、文件夹到Github
    OpenAM
    CentOS 安装 OpenAM
  • 原文地址:https://www.cnblogs.com/liuqing576598117/p/9855235.html
Copyright © 2020-2023  润新知