Volatile(理解)
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(理解)相关推荐
- volatile理解了吗?
到这里大家感觉自己对volatile理解了吗? 如果理解了,大家考虑这么一个问题:ReentrantLock(或者其它基于AQS实现的锁)是如何保证代码段中变量(变量主要是指共享变量 ...
- java多线程之volatile理解
最近一直在看多线程的一些知识,看了一些书和一些博客,收获还是挺多的,最近看了<java并发编程的艺术>这本书感觉收获很大也推荐给各位,同时也结合以前看的博客就好好的总结一下自己所学的 ...
- Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号
首先区分一下Linux信号跟进程间通信中的信号量,它们的关系就犹如老婆跟老婆饼一样,没有一毛钱的关系. 信号的概念 信号的概念:信号是进程之间事件异步通知的一种方式,属于软中断.比如:红绿灯是一种信号 ...
- oracle access manager token,AuthenticationManager验证原理
AuthenticationManager相关类图 AuthenticationManager验证过程 AuthenticationManager验证过程涉及到的类和接口较多,我们就从这里开始逐一分析 ...
- java十年技术栈[总结复习用]
转载自 http://www.cnblogs.com/thingk/p/6813045.html 以下摘自http://www.tvtv223.com/so/8/default/8.html#36-数 ...
- java并发包详解(jdk7)
在此对java并发包做一个大致总结,如有错误,请指正. juc包的总体结构大致如下 外层框架主要有Lock(ReentrantLock.ReadWriteLock等).同步器(semaphores等) ...
- 互联网公司校招Java面试题总结及答案——CVTE
有的没有答案,或者重复的被我去掉了,其他的请参考我的系列文章: 互联网公司校招Java面试题总结及答案--美团 ( 百度Java面经)互联网公司校招Java面试题总结及答案--百度(目前只是部分总结) ...
- 春招:我居然三天就拿到了offer?
1 回顾我的时间线 在本文的开头,先分享一下自己的春招经历吧: 各位掘友大家好,我是练习时长快一年的Android小蔡鸡,喜欢看源码,逛掘金,写技术文章...... 好了好,不开玩笑了OWO,本人大三 ...
- Java内存模型分析
Java内存模型深入分析 0x01 内存模型产生的历史背景 曾经,计算机的世界远没有现在复杂,那时候的cpu只有单核,我们写的程序也只会在单核上按代码顺序依次执行,根本不用考虑太多. 后来,随着技术的 ...
最新文章
- Linux运维人员-服务器组成硬件基础
- postman模拟post请求的四种请求体
- netty系列之:在netty中使用protobuf协议
- 3.寄存器(内存访问)
- 大疆地理围栏系统预防无人机闯入机场
- ZZULIOJ 1110: 最近共同祖先(函数专题)
- 三星年度旗舰S20要来了:潜望式长焦加一亿像素!
- WIN7下 VS2008 无法调试ASP.NET
- ADB 命令知多少?详细 ADB 命令大全来啦
- java日记 简单Java家庭记账系统
- 蓝牙协议层 GATT ,GAP,ATT 之间的关系
- android 实现果冻动画效果,Android果冻效果(阻尼动画)
- 实践材料1(感谢刘望的翻译)
- 凸包Graham算法
- 前端 H5 页面地图展示,只需要传入经纬度就可展示地图及周边生活娱乐
- Java数组实现冒泡排序
- wyt1210笔试、面试
- ThinkPHP框架总结之配置及使用
- QGIS编译(跨平台编译)之十五:geos编译(Windows、Linux、MacOS环境下编译)
- Flutter集成百度定位和百度地图