JAVA中voltatile关键字的使用

1.首先要明白一个概念 JAVA中主内存和线程工作内存的概念。

 如果有一个static的变量,值会存储在主内存。如果多个线程访问这个变量,每个线程都会将变量的值拷贝到自己的工作内存,之后的操作就是针对自己工作内存里副本的操作,最后再写回主内存

明显,上面的操作非原子操作,会出现经典的多线程问题:

    变量 i=6,线程A和B都对i进行加1操作,期待i为8,但是:
    线程A访问 i,
    线程A进行 i++操作
    线程B访问 i,
    线程B进行 i++操作
    线程A更新i,i为7
    线程B更新i,i为7

2. volatile关键字,告诉JVM,我访问的这个变量,不需要创建工作内存的副本,我要直接操作主内存上的变量,它涉及到 多线程里的可见性:

  对于可见性,Java提供了volatile关键字来保证可见性。

  当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。

  而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。

3. 但是,volatile依然无法保证原子性,在1中所说的情况依然会出现,所以volatile可以保证可见性,不能保证原子性

4. 那么原子性和可见性有什么区别呢?

原子性就是一个操作的执行是不能被打断的

可见性是一个操作的执行结果马上被其他操作所感知,区别于原子性是,不能保证本操作不被打断,只是本操作执行的结果能够被其他操作所感知

时间: 2024-10-25 15:07:00

JAVA中voltatile关键字的使用的相关文章

转:java中volatile关键字的含义

转:java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制. synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用 sync

java中的关键字static(静态变量)和final定义常量

1 package point; 2 3 class Point { 4 5 int x = 0; 6 int y = 0; 7 static int z = 100; // 定义静态变量z,类变量 8 static final double PI = 3.1415926;// final定义常量,它的值在运行时不能被改变 9 10 Point(int a, int b) { 11 //PI=3.1415926; 12 /* 13 * 当使用静态常量的时候,不能在构造函数中初始化, 因为静态时,

Java中this关键字的使用

Java中this关键字的使用主要有两处: 1.构造方法 this指的是调用构造方法进行初始化的对象. //有参构造 public Human(String name, int age) { this(); //调用无参构造 //this(name); //调用有参构造(参数为name的构造方法) this.name = name; this.age= age; } 2.普通方法(非静态方法) this指的是调用该方法的对象. //普通方法 public void setName(String

Java复习笔记--java中this 关键字

Java中this关键字,this可以调用类的成员变量和成员方法,this还可以调用类中的构造方法.使用这种方式值得注意的是, 只可以在无参构造方法中的第一句使用this关键字调用有参构造方法. public class AnyThting{ public AnyThting(){ this("this 调用有参构造方法"); System.out.println("无参构造方法"); } public AnyThting(String name){ System.

java中static关键字总结

Java中,static关键字一般情况下有四种用法: 用来修饰一个变量. 用来修饰一个方法. 用来修饰一个内部类. 用来修饰一段代码块. 1 public class Student{ 2 String name; 3 static int count;//static修饰的变量 4 static{//static修饰的代码块 5 count=0; 6 } 7 public static void playGame(){//static修饰的方法 8 System.out.println("我爱

Java中native关键字

Java中native关键字 标签: Java 2016-08-17 11:44 54551人阅读 评论(0) 顶(23453) 收藏(33546) 今日在hibernate源代码中遇到了native关键词,甚是陌生,就查了点资料,对native是什么东西有了那么一点了解,并做一小记. native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中.Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言

慕课网-安卓工程师初养成-2-1 Java中的关键字

来源:http://www.imooc.com/code/1176 Java 中常用关键字: 问:这么多,记不住啊......-_-|| 答:现在不需要你记住所有,混个眼熟即可,在学习的过程中,你会逐步找到感觉并记住他们 对了,差点忘了大事,Java 关键字是区分大小写的哦!所以 void 是关键字,但 Void 就不是了~~ 任务 是否理解 Java 中的关键字了呢?一起验证一下吧! public class HelloWorld { public static voiD main(Strin

【转】java中volatile关键字的含义

java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制. synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用 synchr

关于Java中final关键字的用法总结

用于数据 永不改变的编译时常量,必须是基本类型,static final常量定义时必须赋值 一个运行时被初始化却又不希望被改变的值 空白final,确保使用前必须被初始化,但有更大的灵活性 final参数,用于对象引用,对象不可改变,用于基本类型,值不可以改变 用于方法 防止方法的行为被改变,不可覆盖 private方法默认为final的 曾经使用final方法可以提高效率,现已不提倡 用于类 表示该类不可以被继承 final类方法默认指定为final的 关于Java中final关键字的用法总结