volatile

volatile关键字的主要作用是使变量在多个线程间可见

使用方法:

private volatile int number=0;

图示:

两个线程t1和t2共享一份数据,int a=0,但是两个线程间是不可见的,t1修改a=10,但对于t2来说a还是从0变到20,两个线程是独立的,不可见的;

我想做的是a如果变化了,t1和t2实时的知道a变化了,即a不是从0变到20,而是从10变到20;即t1对a发生修改,t2实时知道a发生变化了;同理,t2中a变成20了,t1也能马上知道值变成20了;volatile关键字就能实现这个.

运行结果如下:

虽然输出了isRunning的值已经被设置成了false,但是线程仍然在运行;这是什么原因呢?

这是java  jdk的原因

java  jdk在执行一个程序时,都会分配一个单独的空间,但是在jdk1.5以后,它对每一个线程做了一个优化,对每个线程加了一块独立的运行空间,这块空间装主内存的一些引用(当前线程的一些引用变量),相当于拷贝了一份副本,线程运行时直接去副本取内容.这样做的目的是,让线程在执行时效率更高

加volatile关键字后:

这是为什么呢?

内存分析图:

volatile只具有可见性不具备原子性(原子操作是不可分割的,在执行完毕不会被任何其它任务或事件中断)

总结:

volatile关键字虽然拥有多个线程之间的可见性,但是不具备同步性(也就是原子性),可以算上是一个轻量级的synchronized,性能要比synchronized强很多,不会造成阻塞(在很多开源的架构里,比如netty的底层就大量使用volatile,可见netty一定是非常不错的)

这里需要注意:一般volatile用于只针对于多个线程可见的变量操作,并不能代替synchronized的同步功能.

测试不具备原子性,例如:

一个count,10个数组,每组加1000次,所以count结果应该为1000*10=10000

打印结果:

说明volatile修饰不具备原子性.为啥呢??

第一个线程执行完1000,完了之后要打印,但是打印出来需要时间,在打印过程中,有可能第二个线程进去执行count++,所以打印出来的结果就如上图所示,但是观察最后一个线程,如果满足原子特性的化就一定是10000

如何保证原子性操作呢?

使用AtomicInteger这个类,去多线程并发的原子操作,它有很多类型

======================================================================

示例总结:

volatile关键字只具有可见性,没有原子性.要实现原子性建议使用atomic类的系列对象

06.volatile关键字的更多相关文章

  1. C/C++中volatile关键字详解

    1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier.这是 BS 在 "The ...

  2. C:详解C中volatile关键字

    原文地址:http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html volatile提醒编译器它后面所定义的变量随时都有可 ...

  3. 【转】 详解C中volatile关键字

    转自: http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html volatile提醒编译器它后面所定义的变量随时都有可能 ...

  4. 详解C中的volatile关键字【转】

    本文转载自:http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html volatile提醒编译器它后面所定义的变量随时都有 ...

  5. TQ2440之定时器中断0——volatile关键字的重要作用

    近日,在学习<ARM处理器裸机开发实战--机制而非策略>一书,在TQ2440开发板上,按照书中实例以及光盘配套程序源代码进行Timer0中断试验,编译成功后烧写到开发板上,没有任何反应,反 ...

  6. 【转】volatile关键字。编译器不优化,多线程会改。防止随时变动的

    来自:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777432.html 1. 为什么用volatile? C/C++ 中的 vol ...

  7. C中的volatile关键字

    volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据.如果没有volatile关键字,则编译器可能优化读取和存储 ...

  8. Java并发之(1):volatile关键字(TIJ21-21.3.3 21.3.4)

    Java并发Java服务器端编程的一项必备技能. ** 1 简介    volatile是java中的一个保留关键字,它在英语中的含义是易变的,不稳定的.volatile像final.static等其 ...

  9. 详解C中volatile关键字(转)

    volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据.如果没有volatile关键字,则编译器可能优化读取和存储 ...

随机推荐

  1. 下载安装GO,编辑器GOLand和在GOLand上运行项目的几种方式

    下载安装GO 下载GO地址:https://golang.google.cn/dl/,一直下一步下一步的操作. 安装完成之后,会有一个GOPATH(此路径是创建go项目的时候会自动在该文件夹下创建), ...

  2. npm run脚本传参

    1. 脚本上有set设置全局变量 "scripts": {     "start": "set REACT_APP_BA=12345 &&am ...

  3. Codeforces VP/补题小记 (持续填坑)

    Codeforces VP/补题小记 1149 C. Tree Generator 给你一棵树的括号序列,每次交换两个括号,维护每次交换之后的直径. ​ 考虑括号序列维护树的路径信息和,是将左括号看做 ...

  4. Bean管理学习笔记

    1.BeanFactory 介绍 1.1 首先什么是Bean? 1.Bean在Spring技术中是基于组件 2.他是Spring容器管理的最基本最常见的单元.在spring的应用场合中,bean可以是 ...

  5. C# vb .net实现羽化效果

    在.net中,如何简单快捷地实现Photoshop滤镜组中的羽化效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...

  6. DHCP服务器的架设

    DHCP服务器的架设 一.DHCP服务器的安装要求: 搭建DHCP服务器需要一些必备条件支持,主要有以下方面: 需要一台运行Windows Server系统的服务器,并为其指定静态IP地址. 根据子网 ...

  7. window 命令行强制删除文件、文件夹

    1. 强制删除文件文件夹和文件夹内所有文件 rd/s/q D:\app 2. 强制删除文件,文件名必须加文件后缀名 del/f/s/q D:\app.txt

  8. React Native 开发豆瓣评分(四)集中管理 fetch 数据请求

    豆瓣评分的API接口 接口是从网上查找的,看样子应该是微信小程序里面扣出来的(ua 里面有 wechatdevtools) 接口都需要设置apiKey(054022eaeae0b00e0fc068c0 ...

  9. Node学习之(第三章:仿Apache显示目录列表的功能)

    前言 今天咱们用Node.js中的核心模块以及上节学习的模板引擎art-template来实现服务器软件Apache的大体功能.用过Apache的朋友都知道,我们只需把本地文件放置在Apache的ww ...

  10. dota2从窗口模式切换到独占全屏模式后黑屏解决办法

    在dota2安装目录中查找video.txt,修改setting.defaultres与setting.defaultresheight两个参数与显示器的分辨率相同. 修改setting.fullsc ...