zoukankan      html  css  js  c++  java
  • [Android Pro] static 和 Volatile 的区别

    reference to : http://blog.sina.com.cn/s/blog_4e1e357d0101i486.html

    static也是各个业务方可以去全局修改;

    volatile是处理多线程锁的替代方案,对应有时需要实时的修改共享资源的变量,被volatile修复的变量的值可以立刻被业务方取得最新的值。
     
    不过,猛地感觉,nnd,这不是一样么,static是静态的,所以理论上也可以在不同线程去访问,能访问也就是能修改,所以这里老穆在网上搜了搜 相关的资料,把这个知识点在加强下:
     

    变量放在主存区上,使用该变量的每个线程,都将从主存区拷贝一份到自己的工作区上进行操作。

    volatile, 声明这个字段易变(可能被多个线程使用),Java内存模型负责各个线程的工作区与主存区的该字段的值保持同步,即一致性。

    static, 声明这个字段是静态的(可能被多个实例共享),在主存区上该类的所有实例的该字段为同一个变量,即唯一性。

    volatile, 声明变量值的一致性;static,声明变量的唯一性。

    此外,volatile同步机制不同于synchronized, 前者是内存同步,后者不仅包含内存同步(一致性),且保证线程互斥(互斥性)。
    static 只是声明变量在主存上的唯一性,不能保证工作区与主存区变量值的一致性;除非变量的值是不可变的,即再加上final的修饰符,否则static声明的变量,不是线程安全的。

    下面摘自Java语言规范(Java Language Specification)的官方解释:

    1) If a field is declared static, there exists exactly one incarnation of the field, no matter how many instances (possibly zero) of the class may eventually be created. 

    2) A field may be declared volatile, in which case the Java Memory Model ensures that all threads see a consistent value for the variable。

  • 相关阅读:
    陈应松《母亲》
    黄灯:一个农村儿媳眼中的乡村图景
    喝完茶为什么嘴里是甜的
    俗语一千条
    XtraBackup完整备份与增量备份的原理
    李嘉诚:90%考虑失败 关注细节
    redo和undo的区别
    tar命令
    自增锁引发的悲剧
    各版本 MySQL 并行复制的实现及优缺点
  • 原文地址:https://www.cnblogs.com/0616--ataozhijia/p/5316523.html
Copyright © 2011-2022 走看看