JAVA线程安全:[4]volatile关键字

volatile是java提供的一种同步手段,只不过它是轻量级的同步,为什么这么说,因为volatile只能保证多线程的内存可见性,不能保证多线程的执行有序性。而最彻底的同步要保证有序性和可见性,例如:synchronized。

操作方法

  • 01

    任何被volatile修饰的变量,都不拷贝副本到工作内存,任何修改都及时写在主存。因此对于Valatile修饰的变量的修改,所有线程马上就能看到,但是volatile不能保证对变量的修改是有序的。什么意思呢?假如有这样的代码: Java代码 public class VolatileTest { public volatile int a; public void  add(int count) { a=a+count; } }

  • 02

    当一个VolatileTest对象被多个线程共享,a的值不一定是正确的,因为a=a+count包含了好几步操作,而此时多个线程的执行是无序的,因为没有任何机制来保证多个线程的执行有序性和原子性。volatile存在的意义是,任何线程对a的修改,都会马上被其他线程读取到,因为直接操作主存,没有线程对工作内存和主存的同步。所以,volatile的使用场景是有限的,在有限的一些情形下可以使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:1)对变量的写操作不依赖于当前值。2)该变量没有包含在具有其他变量的不变式中

  • 03

    volatile只保证了可见性,所以Volatile适合直接赋值的场景,如 Java代码 public class VolatileTest { public volatile int a; public void setA(int a) { this.a=a; } } public class VolatileTest { public volatile int a;www.gzlij.com public void setA(int a) { this.a=a; } }

  • 04

    在没有volatile声明时,多线程环境下,a的最终值不一定是正确的,因为this.a=a;涉及到给a赋值和将a同步回主存的步骤,这个顺序可能被打乱。如果用volatile声明了,读取主存副本到工作内存和同步a到主存的步骤,相当于是一个原子操作。所以简单来说,volatile适合这种场景:一个变量被多个线程共享,线程直接给这个变量赋值。这是一种很简单的同步场景,这时候使用volatile的开销将会非常小。

(0)

相关推荐

  • java多线程之volatile关键字

    操作方法 01 Java线程:volatile关键字 Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量.这两种机制的提出都是为了实现代码线程的安全性.其中 Volat ...

  • JAVA线程安全:[1]浅谈JAVA内存模型

    关于java线程安全,网上有很多资料,我只想从自己的角度总结对这方面的考虑,有时候写东西是很痛苦的,知道一些东西,但想用文字说清楚,却不是那么容易.我认为要认识java线程安全,必须了解两个主要的点: ...

  • java线程池的使用

    大量的创建线程,会过度消耗计算机资源,对于比较简单的任务可以使用线程池,限制过度创建线程.Java中提供大量的线程池构类,类型多种多样,包括: (1) newCachedThreadPool (2) ...

  • 基于Java线程实现后台定时监控

    熟悉编写JavaScript的人,都习惯在页面写入setTimeOut来实现web页面的定时监控或事务处理.但是如何在Java服务端来实现这样一个监控机制呢?一般大家都会想到线程.但是一直以来,都没有 ...

  • java线程系列---Runnable和Thread的区别

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...

  • java的循环结构及关键字介绍

    java的循环结构主要有三种 while ,do while,for.循环是java编程的最基本的应用之一,广泛的应用在我们的开发中,本文我将详细介绍这几种循环的用法以及循环中应用的关键字. 操作方法 ...

  • C语言中关键字const、volatile、extern的作用

    C语言中关键字const.volatile.extern的作用 操作方法 01 const:被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.它可以修饰函数的参数.返回值, ...

  • 实用的5个Java堆优化技巧

    操作方法 01 许多性能问题都是由Java堆容量不足和调优引起的.下面南宁达内java培训小编将和大家分享非常实用的5个Java堆优化技巧. 02 1.JVM:对难以理解的东西产生恐惧感 千万不要以为 ...

  • Solaris Java运行环境配置

    Java运行环境概述 JRE 是运行 Java 程序的最低的标准 Java 平台。它包含 Java 虚拟机 (JVM)、Java核心类和支持文件。使用 ''java'' 工具从命令行调用 JRE(参见 ...