volatile变量的主要作用:是使变量在多个线程间可见。

在java中每一个线程都会有一块工作内存区,其中存放着所有线程共享的主内存的变量值的拷贝。当线程执行时,它在自己的工作内存区操作这些变量,为了读取一个共享的变量,一个线程会获取锁定并去清除它的内存工作区,把这些共享变量从所有线程的共享工作区中正确的装入到它自己所在的工作内存区中,当线程解锁时保证该工作内存区中变量的值写回到共享内存中。

volatile的作用就是强制线程到主内存(共享内存)里读取数据,而不去工作线程区里去读取,从而实现了多个线程间变量可见。也就是满足了线程安全的可见性。

当然用synchronized也能实现volatile的功能,但是仅仅为了读写一个或两个实例域就是用synchronized,会让CPU开销很大。

举个栗子:

 public class RunThread extends Thread{

     private volatile boolean isRunning = true;
private void setRunning(boolean isRunning){
this.isRunning = isRunning;
} public void run(){
System.out.println("进入run方法..");
int i = 0;
while(isRunning == true){
//..
}
System.out.println("线程停止");
} public static void main(String[] args) throws InterruptedException {
RunThread rt = new RunThread();
rt.start();
Thread.sleep(1000);
rt.setRunning(false);
System.out.println("isRunning的值已经被设置了false");
} }

在这个栗子中,创建子线程 rt 并启动后,就让主线程休眠 1s,让子线程 rt 运行,因为此时 isRunning为true,所以 rt 子线程会一直循环执行下去。当主线程休眠1s结束,将 isRunning的值改为了false,rt 子线程不在执行循环,rt子线程结束。执行结果为:

volatile虽然拥有多个线程之间的可见性,但是却不具备同步性(即原子性),一般volatile用于只针对多个线程可见的变量操作,并不能代表synchronized的同步操作。

举个栗子:

 package com.song.test;

 public class TestVolatile extends Thread {
public volatile static int n = 0; public static void main(String[] args) {
TestVolatile t1 = new TestVolatile();
t1.start();
for (int i = 0; i < 200000; i++) {
n=n+1;
System.out.println(n);
} } public void run() {
for (int i = 0; i < 200000; i++) {
n=n+1;
System.out.println(n);
}
}
}

volatile 验证非原子性操作的栗子

在这个例子中,让 n 通过主线程和子线程分别加了两回,每次加了20000,如果是原子性操作那么n最终的值应该是400000,但实际上它的值是399998,因为它是非原子性的:

结果为:

那怎么用volatile关键字呢。对volatile修饰的变量要所有筛选:

变量的读写操作是独立的,不依赖其当前值(如 n=n+1),也不依赖于其他状态状态变量的共同参与与不变约束。

java线程学习之volatile关键字的更多相关文章

  1. java 线程Thread 技术--volatile关键字

    java 语言中允许线程访问共享变量,为了保证共享变量能被准确和一致的更新,Java 语言提供了volatile 关键字,也就是我们所说的内存一致性: 问题抛出:(尝试去运行下面代码,以及将volat ...

  2. java线程学习之synchronized关键字

    关键字synchronized的作用是实现线程间的同步.它的任务是对同步的代码加锁.一个代码块同时只能有同一个线程进行读和写操作,从而保证线程间是安全的. 线程安全的概念是:当多个线程访问某一个类(对 ...

  3. Java并发编程学习:volatile关键字解析

    转载:https://www.cnblogs.com/dolphin0520/p/3920373.html 写的非常棒,好东西要分享一下 Java并发编程:volatile关键字解析 volatile ...

  4. Java并发编程:volatile关键字解析(学习总结-海子)

    博文地址:Java并发编程:volatile关键字解析

  5. Java并发编程:volatile关键字解析

    Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...

  6. 【转】Java并发编程:volatile关键字解析

    转自:http://www.importnew.com/18126.html#comment-487304 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备 ...

  7. (转)Java并发编程:volatile关键字解析

    转:http://www.cnblogs.com/dolphin0520/p/3920373.html Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或 ...

  8. 《转》JAVA并发编程:volatile关键字解析

    volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...

  9. Java并发编程:volatile 关键字

    转自:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 其实Java语言是支持多线程的,为了解决线程并发的问题,在语言内部 ...

随机推荐

  1. jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题

    jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题 之前在项目中根据需求,需要自定义标签,经过查询w3c文档,自己也踩了一些坑,特此记录自定义标签的步骤,下面就以我之前的一个例子中的定义一 ...

  2. elasticsearch视频34季

    02_结构化搜索_在案例中实战使用term filter来搜索数据 课程大纲 1.根据用户ID.是否隐藏.帖子ID.发帖日期来搜索帖子 (1)插入一些测试帖子数据 POST /forum/articl ...

  3. static和extern的用法小结

    以前写程序是,基本不管static和extern,一个工程文件也只有一个c文件.今天尝试用多个文件来写,自然就涉及到这两个关键词的使用,自己查了些资料,并且做了些实验,总结如下. extern的用法 ...

  4. Java自学笔记

    1.标识符:字母,数字,下划线,美元符组成,不可以已数字开头,并且严格区分大小写 2.变量 有三个元素描述变量,变量类型,变量名,变量值 如何命名变量:首字母为 字母:下划线:“$“符号,其余部分为 ...

  5. DevPress GridControl的使用

      XtraGrid使用方法 XtraGrid的关键类就是:GridControl和GridView.GridControl本身不显示数据,数据都是显示在GridView/CardView/XXXXV ...

  6. 2018-2019-2 网络对抗技术 20165311 Exp6 信息搜集与漏洞扫描

    20165311 Exp6 信息搜集与漏洞扫描 1.实验内容 2.实验过程 任务一:各种搜索技巧的应用 通过搜索引擎进行信息搜集 使用FOFA.SO 搜索特定类型的文件 任务二:DNS IP注册信息的 ...

  7. Robot Framework 自动化测试 Selenium2Library 库 用法

    Robot Framework自动化测试Selenium2Library库详细用法 一.浏览器驱动   通过不同的浏览器执行脚本.   Open Browser Htpp://www.xxx.com ...

  8. iOS开发支付篇-内购(IAP)

    一,前言 经典文章参考: . http://yimouleng.com/2015/12/17/ios-AppStore/ 内购流程 . http://www.jianshu.com/p/b199a46 ...

  9. 从github上下载一个项目的子目录

    https://github.com/pbojinov/developer.chrome.com/tree/master/extensions/examples/extensions/proxy_co ...

  10. ambari卸载集群

    #1.删除hdp.repo和hdp-util.repo cd /etc/yum.repos.d/ rm -rf hdp* rm -rf HDP* #rm -rf ambari* #2.删除安装包 #用 ...