static 和 Volatile 的区别

如题所述

第1个回答  2017-08-20
两者的区别:volatile, 声明变量值的一致性;static,声明变量的唯一性。
volatile, 声明这个字段易变(可能被多个线程使用),Java内存模型负责各个线程的工作区与主存区的该字段的值保持同步,即一致性。
static, 声明这个字段是静态的(可能被多个实例共享),在主存区上该类的所有实例的该字段为同一个变量,即唯一性。
此外,volatile同步机制不同于synchronized, 前者是内存同步,后者不仅包含内存同步(一致性),且保证线程互斥(互斥性)。
static 只是声明变量在主存上的唯一性,不能保证工作区与主存区变量值的一致性;除非变量的值是不可变的,即再加上final的修饰符,否则static声明的变量,不是线程安全的。
第2个回答  2017-09-12
变量放在主存区上,使用该变量的每个线程,都将从主存区拷贝一份到自己的工作区上进行操作。

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。本回答被提问者采纳
第3个回答  2017-06-11
static和volatile的用法
volatile
volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

使用该关键字的例子如下:
int volatile nVint;
当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。

static 和 Volatile 的区别
static 和 Volatile 的区别 两个单词词义完全不同.static adj. 静止的; 静电的; 不变的; [物] 静力的;n. 静电; 静力学; [物]静电(干扰); 争吵;volatile adj. 易变的,不稳定的; (液体或油) 易挥发的; 爆炸性的; 快活的,轻快的;

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

static 和 Volatile 的区别
volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。static作用:static静态变量声明符。在声明它的程序块,子程序块或函数内部有效,值保持,在整个程序期间分配存储器空间,编译器默认值0。

static 和 Volatile 的区别
static指的是类的静态成员,实例间共享volatile跟Java的内存模型有关,线程执行时会将变量从主内存加载到线程工作内存,建立一个副本,在某个时刻写回。valatile指的每次都读取主内存的值,有更新则立即写回主内存。理解了这两点,逐句再来解释你的困惑:“既然static保证了唯一性”:static保证唯一性,指...

static 和 Volatile 的区别
static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。就象大家更熟悉的const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致...

static,const,volatile,define关键字的作用与区别
全局变量本来就存储在静态区,因此static并不能改变其存储位置。但是,static限制了其链接属性。被static修饰的全局变量只能被该包含该定义的文件访问(即改变了作用域)。static修饰函数使得函数只能在包含该函数定义的文件中被调用。对于静态函数,声明和定义需要放在同一个文件夹中。被static修饰的数据成员...

...static、register、const、volatile、ex...
3.static:有两种用途,一是统计函数调用次数,二是降低局部变量初始化开销,如在函数内声明的静态变量仅在当前函数作用域可见。4.const:强制保护变量,防止意外修改,可用于参数、返回值和成员函数,提高程序健壮性。5.volatile:表示变量可能在外部被改变,需要编译器每次重新读取,常用于多线程环境中的...

在c语言中修饰符的用法
类型修饰符:对内存资源存放位置的限定。关键字:auto、register、static、const、extern、volatile。1、auto:默认实现的,auto int a;默认分配的内存区域都是可读可写的区域。2、register:限制变量定义在寄存器上的修饰符,CPU上的寄存器,读取速度快。3、static:静态修饰符,修饰函数内部的变量、函数外...

关键字static、Const、Volatile的作用是什么
它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。3). 这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译...

C中的auto、static、register、extern、const和volitate
C语言中变量的存储类别包括auto、static、register、extern和const、volatile,它们分别定义了变量在内存中的存储方式和行为。自动存储的auto变量(如不声明static)在函数调用时动态分配空间,函数结束即释放。静态存储的static则保留函数调用时的值,可用于保存状态或限制作用域。register用于频繁使用的局部变量,...

相似回答