volatile是java虚拟机提供的轻量级的同步机制。

1.保证可见性。2.不保证原子性。3.禁止指令重排。

package Juc;import java.util.concurrent.TimeUnit;class MyData
{/*volatile*/ int number=0;   //测试可见性public void addT060(){this.number = 60;}
}/*** 验证volatile的可见性* 1.1 假如 int number =0 ; number 变量之前根本没有添加volatile关键字修饰,没有可见性。* @author * @date 2019年9月27日**/public class VolatileDemo {public static void main(String[] args) { //main是一切方法的运行入口MyData mydata=new MyData(); //资源类new Thread(() -> {System.out.println(Thread.currentThread().getName()+"\t come in");try {TimeUnit.SECONDS.sleep(3);} catch (Exception e) {e.printStackTrace();}mydata.addT060();System.out.println(Thread.currentThread().getName()+"\t updated number value: "+mydata.number);},"aaa").start();//第二个线程就是我们的main线程while(mydata.number==0){//main 线程一直再这里循环,直到number值不再等于0;}System.out.println(Thread.currentThread().getName() +"\t mission is over");}}

不添加volatile结果:

添加volatile主存的可见性:

volatile不保证原子性(20线程操作同一贮存共享变量number)

package Juc;import java.util.concurrent.TimeUnit;class MyData
{volatile int number=0;   //测试可见性public void addT060(){this.number = 60;}//请注意,此时number前面是加了volatile关键字修饰,volatile不保证原子性public void addplusplus(){number++;}
}/*** 验证volatile的可见性* 1.1 假如 int number =0 ; number 变量之前根本没有添加volatile关键字修饰,没有可见性。* 1.2 添加volatile解决可见性问题。* * 2 验证volatile不保证原子性*       2.1原子性指的什么意思*               不可分割,完整性,也即某个线程正在做某个具体业务时,中间不可以被加塞或者分割。需要整体完整*                 要么同时成功,要么同时失败。* * 2.2 volatile不保证原子性案例* @author * @date 2019年9月27日  Email:2578894625**/public class VolatileDemo {public static void main(String[] args) //main是一切方法的运行入口{ MyData mydata=new MyData();for (int i = 0; i < 20; i++) {new Thread(() -> {for (int j = 0; j < 1000; j++) {mydata.addplusplus();}},String.valueOf(i)).start();}//需要等待上面20个线程完成后全部计算完成后,再用main线程取得最终结果值看是多少?//try {TimeUnit.SECONDS.sleep(5);} catch (Exception e) {e.printStackTrace();}while(Thread.activeCount()>2){ //默认2个线程,main线程和Gc线程。Thread.yield(); //礼让线程}System.out.println(Thread.currentThread().getName()+"\t finally number value :"+mydata.number);}
}

结果:

解决原子性
1.加synchronized
2.使用JUC下的AtomicInteger

package Juc;import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;class MyData
{volatile int number=0;   //测试可见性public void addT060(){this.number = 60;}//请注意,此时number前面是加了volatile关键字修饰,volatile不保证原子性public /*synchronized*/ void  addplusplus(){number++;}AtomicInteger atomicInteger=new AtomicInteger();public void addMyAtomic(){atomicInteger.getAndIncrement();}
}/*** 验证volatile的可见性* 1.1 假如 int number =0 ; number 变量之前根本没有添加volatile关键字修饰,没有可见性。* 1.2 添加volatile解决可见性问题。* * 2 验证volatile不保证原子性*       2.1原子性指的什么意思*               不可分割,完整性,也即某个线程正在做某个具体业务时,中间不可以被加塞或者分割。需要整体完整*                 要么同时成功,要么同时失败。* * 2.2 volatile不保证原子性案例*  why*  2.4 解决原子性*  1.加synchronized*  使用JUC下的AtomicInteger*  * @author * @date 2019年9月27日  **/public class VolatileDemo {public static void main(String[] args) //main是一切方法的运行入口{ MyData mydata=new MyData();for (int i = 0; i < 20; i++) {new Thread(() -> {for (int j = 0; j < 1000; j++) {mydata.addplusplus();mydata.addMyAtomic();}},String.valueOf(i)).start();}//需要等待上面20个线程完成后全部计算完成后,再用main线程取得最终结果值看是多少?//try {TimeUnit.SECONDS.sleep(5);} catch (Exception e) {e.printStackTrace();}while(Thread.activeCount()>2){ //默认2个线程,main线程和Gc线程。Thread.yield(); //礼让线程}System.out.println(Thread.currentThread().getName()+"\t int finally number value :"+mydata.number);System.out.println(Thread.currentThread().getName()+"\t AtomicInteger finally number value :"+mydata.atomicInteger);}}

Volatile(理解)相关推荐

  1. volatile理解了吗?

    到这里大家感觉自己对volatile理解了吗?          如果理解了,大家考虑这么一个问题:ReentrantLock(或者其它基于AQS实现的锁)是如何保证代码段中变量(变量主要是指共享变量 ...

  2. java多线程之volatile理解

       最近一直在看多线程的一些知识,看了一些书和一些博客,收获还是挺多的,最近看了<java并发编程的艺术>这本书感觉收获很大也推荐给各位,同时也结合以前看的博客就好好的总结一下自己所学的 ...

  3. Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号

    首先区分一下Linux信号跟进程间通信中的信号量,它们的关系就犹如老婆跟老婆饼一样,没有一毛钱的关系. 信号的概念 信号的概念:信号是进程之间事件异步通知的一种方式,属于软中断.比如:红绿灯是一种信号 ...

  4. oracle access manager token,AuthenticationManager验证原理

    AuthenticationManager相关类图 AuthenticationManager验证过程 AuthenticationManager验证过程涉及到的类和接口较多,我们就从这里开始逐一分析 ...

  5. java十年技术栈[总结复习用]

    转载自 http://www.cnblogs.com/thingk/p/6813045.html 以下摘自http://www.tvtv223.com/so/8/default/8.html#36-数 ...

  6. java并发包详解(jdk7)

    在此对java并发包做一个大致总结,如有错误,请指正. juc包的总体结构大致如下 外层框架主要有Lock(ReentrantLock.ReadWriteLock等).同步器(semaphores等) ...

  7. 互联网公司校招Java面试题总结及答案——CVTE

    有的没有答案,或者重复的被我去掉了,其他的请参考我的系列文章: 互联网公司校招Java面试题总结及答案--美团 ( 百度Java面经)互联网公司校招Java面试题总结及答案--百度(目前只是部分总结) ...

  8. 春招:我居然三天就拿到了offer?

    1 回顾我的时间线 在本文的开头,先分享一下自己的春招经历吧: 各位掘友大家好,我是练习时长快一年的Android小蔡鸡,喜欢看源码,逛掘金,写技术文章...... 好了好,不开玩笑了OWO,本人大三 ...

  9. Java内存模型分析

    Java内存模型深入分析 0x01 内存模型产生的历史背景 曾经,计算机的世界远没有现在复杂,那时候的cpu只有单核,我们写的程序也只会在单核上按代码顺序依次执行,根本不用考虑太多. 后来,随着技术的 ...

最新文章

  1. Linux运维人员-服务器组成硬件基础
  2. postman模拟post请求的四种请求体
  3. netty系列之:在netty中使用protobuf协议
  4. 3.寄存器(内存访问)
  5. 大疆地理围栏系统预防无人机闯入机场
  6. ZZULIOJ 1110: 最近共同祖先(函数专题)
  7. 三星年度旗舰S20要来了:潜望式长焦加一亿像素!
  8. WIN7下 VS2008 无法调试ASP.NET
  9. ADB 命令知多少?详细 ADB 命令大全来啦
  10. java日记 简单Java家庭记账系统
  11. 蓝牙协议层 GATT ,GAP,ATT 之间的关系
  12. android 实现果冻动画效果,Android果冻效果(阻尼动画)
  13. 实践材料1(感谢刘望的翻译)
  14. 凸包Graham算法
  15. 前端 H5 页面地图展示,只需要传入经纬度就可展示地图及周边生活娱乐
  16. Java数组实现冒泡排序
  17. wyt1210笔试、面试
  18. ThinkPHP框架总结之配置及使用
  19. QGIS编译(跨平台编译)之十五:geos编译(Windows、Linux、MacOS环境下编译)
  20. Flutter集成百度定位和百度地图

热门文章

  1. map/reduce之间的shuffle,partition,combiner过程的详解
  2. 微软在线测试之lucky string,有关斐波那契的题目都在此了
  3. IOS多类型Cell的tableView实现
  4. vue上线后,背景图片路径错误
  5. 【leetcode】刷题暂告一个段落
  6. 第一课.axis配置和写法入门
  7. LintCode2016年8月8日算法比赛----子树
  8. 解决Jquery Kendo.xxx is not a function 的方法
  9. OpenCV图像几何变换——转置,镜像,倒置
  10. opencv保存图像自动命名