2019独角兽企业重金招聘Python工程师标准>>>

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

1.死循环

public class PrintInfo implements Runnable {private boolean statu = true;public boolean isStatu() {return statu;}public void setStatu(boolean statu) {this.statu = statu;}public void printInfo() {try {while(statu  == true){System.out.println("The Thread Name Is " + Thread.currentThread().getName());Thread.sleep(1000);Thread.sleep(1000);}} catch (Exception e) {e.printStackTrace();}}@Overridepublic void run() {printInfo();}
}
public class Run {public static void main(String[] args){
PrintInfo printInfo = new PrintInfo();
printInfo.printInfo();
System.out.println("Try To Stop The Thread");
printInfo.setStatu(false);

}
}

运行结果:

2.解决同步死循环

将一中的代码Run类修改为

public class Run {public static void main(String[] args) throws InterruptedException {PrintInfo printInfo = new PrintInfo();Thread thread = new Thread(printInfo);thread.start();Thread.sleep(1000);System.out.println("Try To Stop The Thread");printInfo.setStatu(false);}
}

运行结果:

但当上面的实例代码运行在 -server服务器模式的64位的JVM上时,会出现死循环,解决的办法是使用volatile关键字.

volatile关键字的作用是强制从公共堆栈中取得变量的值,而不是从线程使用数据栈中取得变量的值

3.解决异步死循环

将1中的代码PrintInfo修改为

public class PrintInfo implements Runnable {volatile private boolean statu = true;public boolean isStatu() {return statu;}public void setStatu(boolean statu) {this.statu = statu;}public void printInfo() {try {while(statu  == true){System.out.println("The Thread Name Is " + Thread.currentThread().getName());Thread.sleep(1000);}} catch (Exception e) {e.printStackTrace();}}@Overridepublic void run() {printInfo();}
}

运行结果:

4.关键字synchronized与volatile的区别

使用volatile关键字增加了实例变量在多个线程之间的可见性,但是volatile关键字的缺点是不支持原子性.

1).关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,二synchronized可以修饰方法,以及代码块.随着JDK新版本的发布,synchronized关键字的执行效率得到很大提升,在开发中使用synchronized关键字的比例还是比较大.

2).多线程访问volatile不会发生阻塞,二synchronized回出现阻塞

3).volatile能保证数据的可见性.但不能保证原子性,而synchronized可以保证原子性,也可以间接保证可见性,以内他会将使用内存和公共内存中的数据做同步.

4).关键字volatile解决的是变量在多个线程之间的可见性,而synchronized关键字解决的是多个线程之间访问资源的同步性,

线程安全包含原子性和可见性两个方面,JAVA的同步机制都是围绕这两个方面来确保线程安全的.

5.volatile的非原子特性

public class VolatileThread extends Thread{volatile public static int count ;private static void sumCount(){for(int i = 0 ; i < 10 ; i ++){count ++;}System.out.println("count = " + count);}@Overridepublic void run() {sumCount();}
}
public class Run {public static void main(String[] args){VolatileThread[] volatileThreads = new VolatileThread[100];for(int i = 0 ; i < 10 ; i ++){volatileThreads[i] = new VolatileThread();}for(int i = 0 ; i < 10 ; i ++){volatileThreads[i].start();}}
}

运行结果:

更改VolatileThread类代码为:

public class VolatileThread extends Thread{volatile public static int count ;synchronized private static void sumCount(){for(int i = 0 ; i < 10 ; i ++){count ++;}System.out.println("count = " + count);}@Overridepublic void run() {sumCount();}
}

运行结果:

关键字volatile主要使用的场合是在多个线程中可以感知实例变量被更改了,并且可以获得最新的值使用,也就是用多线程读取共享变量时可以获取最新值使用.

关键字volatile提示线程每次从共享内存中读取变量,而不是从私有内存中读取,这样就保证了同步数据的可见性,但需要注意的是:如果修改实例变量中的数据,比如i++,这样的操作其实并不是一个院子操作,也就是非线程安全的.

表达式i++的操作不走分解如下:

1).从内存中获取i的值,

2).计算i的值,

3).将计算后的值存储到内存中.

如果在第二步时,另一个线程也修改了i的值,那么这个时候就会出现脏数据,解决的办法就是使用synchronized关键字,所以volatile本身并不处理数据的原子性,而是强制对数据的读写及时影响到主内存.

转载于:https://my.oschina.net/scymore/blog/746362

多线程学习笔记(十二)相关推荐

  1. 吴恩达《机器学习》学习笔记十二——机器学习系统

    吴恩达<机器学习>学习笔记十二--机器学习系统 一.设计机器学习系统的思想 1.快速实现+绘制学习曲线--寻找重点优化的方向 2.误差分析 3.数值估计 二.偏斜类问题(类别不均衡) 三. ...

  2. ROS学习笔记十二:使用roswtf

    ROS学习笔记十二:使用roswtf 在使用ROS过程中,roswtf工具可以为我们提供ROS系统是否正常工作的检查作用. 注意:在进行下列操作之前,请确保roscore没有运行. 检查ROS是否安装 ...

  3. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  4. Polyworks脚本开发学习笔记(十二)-输出和读取文本文件

    Polyworks脚本开发学习笔记(十二)-输出和读取文本文件 Polyworks作为一个测量工具,将测量的数据方便的导出到文本文件则是一项必须的功能.在DATA_FILE这个命令下提供了很多子命令用 ...

  5. OpenCV学习笔记(十二)——图像分割与提取

    在图像处理的过程中,经常需要从图像中将前景对象作为目标图像分割或者提取出来.例如,在视频监控中,观测到的是固定背景下的视频内容,而我们对背景本身并无兴趣,感兴趣的是背景中出现的车辆.行人或者其他对象. ...

  6. 【现代机器人学】学习笔记十二:轮式移动机器人

    目录 轮式机器人类型 全向轮式机器人 建模 单个全向轮是怎么运动的 多个全向轮是如何带动底盘运动的 运动规划和反馈控制 非完整约束轮式移动机器人 建模 独轮车 差速驱动机器人 车型机器人 非完整移动机 ...

  7. 【theano-windows】学习笔记十二——卷积神经网络

    前言 按照进度, 学习theano中的卷积操作 国际惯例, 来一波参考网址 Convolutional Neural Networks (LeNet) 卷积神经网络如何应用在彩色图像上? 卷积小知识 ...

  8. (C/C++学习笔记) 十二. 指针

    十二. 指针 ● 基本概念 变量的地址就是指针,存放指针的变量就是指针变量(因而又叫作地址变量 address variable); 这个地址编号本身就是一个无符号的整数,在32位系统下为4字节(8位 ...

  9. Vue.js 学习笔记 十二 Vue发起Ajax请求

    首先需要导入vue-resource.js,可以自己下载引入,也可以通过Nuget下载,它依赖于Vue.js. 全局使用方式: Vue.http.get(url,[options]).then(suc ...

最新文章

  1. [译] ASP.NET 生命周期 – ASP.NET 上下文对象(六)
  2. 分享Hadoop处理大数据工具及优势
  3. CentOS系统代理配置
  4. root域名服务器 gtld服务器_购买阿里云域名和空间服务器实操
  5. IT培训分享:选择哪个编程语言好?
  6. 气温常年在25度的地方_最低调的海滨城市,物价便宜,常年25度,沙滩细白,不输三亚!...
  7. OpenStack-Mitaka 一键安装测试环境脚本
  8. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(一)
  9. python制作手机壁纸_Python爬取手机壁纸图片
  10. s一般怎么称呼自己的m_上海平面设计工资一般是多少,我该怎么提升自己的平面设计能力?...
  11. 求两个整数最大公约数
  12. 微软发布 Win11新补丁
  13. qq linux五笔输入法下载软件,QQ五笔下载官方网站
  14. Linux 777 权限表示什么,各数字又是什么含义?
  15. 【无标题】Linux必学的指令
  16. OTM order management(订单管理)--ORDER BASE
  17. 客户化软件时代的前夜 ZT
  18. Python脚本---在 MySQL数据库中跑批加载多个表的数据
  19. Docker容器技术 |镜像原理 |数据卷 |数据卷容器
  20. 基于京东云云主机搭建WordPress网站

热门文章

  1. android根据中心裁剪图片,拍照,选择照片并进行裁剪,适配Android 7.0
  2. 微型计算机的电池,具有微型计算机芯片的电池蓄电模块、便携式计算机的制作方法...
  3. Error in nextTick
  4. 发货100全功能网站/绿色版
  5. Dailymotion 视频下载神器,喜欢太阳的后裔的人有福了!
  6. Magento教程 23:如何获取销售报表?
  7. 移动Web开发的十条军规
  8. 使用 HTML5 canvas 进行 Web 绘图
  9. 慎用PHP $_REQUEST数组
  10. CAS和AtomicLong和LongAdder