导航:首页 > 编程语言 > java中volatile关键字的含义

java中volatile关键字的含义

发布时间:2023-08-22 23:57:11

『壹』 java 里static 和volatile的区别

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

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。

『贰』 java中的关键字是是什么意思

abstract :表明类或类中的方法是抽象的;
assert :声明断言;
boolean :基本数据类型之一,布尔类型;
break :提前跳出一个块;
byte :基本数据类型之一,字节类型;
case :在switch语句中,表明其中的一个分支
catch :用于处理例外情况,用来捕捉异常;
char :基本数据类型之一,字符类型;
class :类;
continue :回到一个块的开始处;
default :用在switch语句中,表明一个默认的分支;
do :用在“do while”循环结构中;
double :基本数据类型之一,双精度浮点数类型;
else :在条件语句中,表明当条件不成立时的分支;
extends :用来表明一个类是另一个类的子类;
final :用来表明一个类不能派生出子类,或类中的方法不能被覆盖,或声明一个变量是常量;
finally :用于处理异常情况,用来声明一个肯定会被执行到的块;
float :基本数据类型之一,单精度浮点数类型;
for :一种循环结构的引导词;
if :条件语句的引导词;
implements :表明一个类实现了给定的接口;
import :表明要访问指定的类或包;
instanceof :用来测试一个对象是否是一个指定的类的实例;
int :基本数据类型之一,整数类型;
interface :接口;
long :基本数据类型之一,长整数类型;
native :用来声明一个方法是由与机器相关的语言(如C/C++/FORTRAN语言)实现的;
new :用来申请新的对象;
package :包;
private :一种访问模式:私有模式;
protected :一种访问模式:保护模式;
public :一种访问模式:公共模式;
return :从方法中返回值;
short :基本数据类型之一,短整数类型;
static :表明域或方法是静态的,即该域或方法是属于类的;
strictfp :用来声明FP-strict(双精度或单精度浮点数)表达式;
算术规范:
super :当前对象的父类对象的引用;
switch :分支结构的引用词;
synchronized :表明一段代码的执行需要同步;
this :当前对象的引用;
throw :抛出一个异常;
throws :声明方法中抛出的所有异常;
thansient :声明不用序列化的域;
try :尝试一个可能抛出异常的程序块;
void :表明方法不返回值;
volatile :表明两个或多个变量必须同步地发生变法;
while :用在循环结构中;
enum :声明枚举类型;
说明:
⑴Java的关键字也是随新的版本发布在不断变动中的,不是一成不变的。
⑵所有关键字都是小写的。
⑶除这些关键字外,Java还定义了一些保留字,也就是说Java保留了它们,但是没有使用它们,这些词不 能作为标识符使用。
cast、goto、future、generic、inner、operator、outer、rest、var
⑷true和false不是关键字,而是boolean类型直接量。
⑸null也不是关键字。
⑹无sizeof运算符;所有类型的长度和表示是固定的,不依赖执行。

『叁』 java单例双重检查锁为什么需要加volatile关键字

已经修改,的确应该加上volatile关键字。不加的情况下,假设两个线程,线专程A正在执行instance = new Instance()的操作,属而线程B开始执行if(instance==null)的判断,当不存在volatile的时候,因为 new Instance()是一个非原子操作,可能发生无序写入,构造函数可能在整个对象构造完成前执行完毕,线程B可能会看到一个不完整的instance对象,因为java的某些实现会在内存中开辟一片存储对象的区域后直接返回内存的引用,所以线程B判断不为null,而这时候实际上,instance的构造函数还没有执行,从而线程b得到不完整的对象。在 Instance 的构造函数执行之前,会在内存中开辟一片存储对象的区域后直接返回内存的引用,赋值给变量 instance,instance也就可能成为非 null 的,即赋值语句在对象实例化之前调用,此时别的线程得到的是一个还会初始化的对象,这样会导致系统崩溃线程B可能会看到一个不完整的instance对象,因为java的某些实现,所以线程B判断不为null。从而得到不完整的对象。

『肆』 java编程,如何彻底理解volatile关键字

非java程序员,不过volatile在其他语言中也存在,简单说下。
1,volatile只在多线程程序中有意义。
2,为了提高性能,编译器工作时会进行一些优化,如指令排序,甚至跳过一些指令。如:
var
a=1;
a=2;
a=3;
编译后的结果可能就只执行
a
=
3
3,程序运行时,普通变量会有缓存机制(如cpu缓存、线程本地缓存等),程序读取时先从缓存读取,所以多线程的程序运行时可能存在脏读问题。即第一个线程已经修改了变量值,但第二个线程还在使用缓存中的旧数据。
volatile的作用就是告诉编译器,不要对使用该变量的代码进行优化,每次读写操作都访问变量的原始数据。

『伍』 java中对象或者数组用volatile修饰有什么用

就像大家更熟悉的const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会

volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.

『陆』 谁能真正整明白java volatile 关键字

阅读全文

与java中volatile关键字的含义相关的资料

热点内容
win10ime 浏览:271
手机号大数据保护停机是什么意思 浏览:81
两个苹果手机怎么隔空投送app 浏览:903
ps修改有褶皱的文件 浏览:417
javadbfreader 浏览:307
苹果手机数字代码是什么 浏览:66
驱动程序顺序安装脚本 浏览:665
word文件里怎样查重 浏览:219
mx5系统基带版本 浏览:184
ntlea全域通win10 浏览:171
qq怎么查看别人的收藏 浏览:135
地震三参数matlab程序 浏览:57
怎样给优盘文件加密软件 浏览:7
收拾文件有哪些小妙招 浏览:431
pdf文件去底网 浏览:253
win10重装系统需要格式化c盘吗 浏览:424
路由器trx文件 浏览:655
淘宝店铺数据包怎么做 浏览:195
win10键盘黏连 浏览:332
json如何生成表格 浏览:323

友情链接