volatile的理解和使用
package thread; /**
* Created by Administrator on 2017/1/15.
*/
public class Counter {
public volatile static int count = 0; public static void inc() { try {
Thread.sleep(1);
} catch (InterruptedException e) {
} count++;
System.out.println(count);
} public static void main(String[] args) { //同时启动1000个线程,去进行i++计算,看看实际结果 for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
public void run() {
Counter.inc();
}
}).start();
} //这里每次运行的值都有可能不同,可能为1000
System.out.println("运行结果:Counter.count=" + Counter.count);
} }
volatile工作中没用到过,买了本《java并发编程的艺术》,准备系统的学习下多线程.
volatile是轻量级的synchronized,它能够在多处理器开发中保证了共享变量的“可见性”.
可见性:当一个线程修改了一个共享变量时,另一个线程能够读到这个被修改该后的值.
当一个被volatile修饰的共享变量的值发生改变,
1.该值会从处理器缓存中写会到系统内存中.
2.这个写回内存的操作会使得其他cpu里缓存了该内存地址的数据失效(为了提高处理速度,处理器不直接很内存进行通信,而是先将系统内存的数据读到内部缓存后再进行操作.).
这个代码比较有趣:
1.可将volatile删掉,然后发现,输出的结果,并没有1000,因为多个线程在同时对一个变量进行读写,造成有些读写没有保存下来.
2.可以看到
System.out.println("运行结果:Counter.count=" + Counter.count);
这句代码最后输出的数不是1000,因为main函数直到执行结束,仍然还有线程在运行,main函数输出的count并不是最后的结果值.
3.可以看到,当使用volatile后,虽然main函数输出的值仍然不是1000,但在打印出来的数据中可以搜到1000,说明共享变量确实是得到了想要的值,尽管不是最后一个打印出来的(这和代码中thread.sleep(1)有关系,还可能和线程切换,处理器时间片有关,我并不是很清楚),可以将thread.sleep代码去掉,可以得到按顺序输出的数值,最后输出的是1000.
(多线程第一篇)
volatile的理解和使用的更多相关文章
- Java线程工作内存与主内存变量交换过程及volatile关键字理解
Java线程工作内存与主内存变量交换过程及volatile关键字理解 1. Java内存模型规定在多线程情况下,线程操作主内存变量,需要通过线程独有的工作内存拷贝主内存变量副本来进行.此处的所谓内存模 ...
- volatile变量理解 via《Java并发编程实战》
第3章:对象的共享 volatile关键字的理解 volatile变量,用来确保将变量的更行操作通知到其他线程.当变量申明为volatile类型后,编译器与运行时都会注意带这个变量时共享的,因此不会将 ...
- 对volatile的理解--从JMM以及单例模式剖析
请谈谈你对volatile的理解 1.volitale是Java虚拟机提供的一种轻量级的同步机制 三大特性1.1保证可见性 1.2不保证原子性 1.3禁止指令重排 首先保证可见性 1.1 可见性 概念 ...
- volatile的理解
用法解释 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其 ...
- 对于volatile的理解
哎.要学的东西太多,时间太少.一周的工作下来要总结的东西太多,还处理不完,越积越多.大周末的好想出去玩啊.... 得嘞,废话止于此. 无聊时候乱看网页发现了volatile的一篇文章,以前曾经对vol ...
- 关于java多线程关键字volatile的理解
volatile关键字的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值. 使用volition关键字增加了实例变量在多个线程间的可见性.但volition有个致命的缺点就是不 ...
- (转)volatile 的理解
对于(volatile unsigned char *)0x20我们再分析一下,它是由两部分组成: 1) (unsigned char *)0x20,0x20只是个值,前面加(unsigned cha ...
- Volatile关键字理解
Volatile定义 为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量.Java语言提供了volatile,在某些情况下比锁更加方便.如果一个字段被声明成volatile, ...
- java中关于volatile的理解疑问?
作者:xyzZ链接:https://www.zhihu.com/question/49656589/answer/117826278来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...
随机推荐
- FileReader和BufferedReader的区别
1.FileReader不能一行行读 FileReader fr = null; try { fr = new FileReader(new File(path)); StringBuffer str ...
- android 权限管理和签名 实现静默卸载
为了实现静默卸载, 学了下android的安全体系,记录如下 最近在做个东西,巧合碰到了sharedUserId的问题,所以收集了一些资料,存存档备份. 安装在设备中的每一个apk文件,Android ...
- telnet关闭tomcat
telnet localhost 8005然后输入SHUTDOWN即可关闭tomcat 前提是8005端口已打开
- aapt: error while loading shared libraries: libstdc++.so.6: wrong ELF class: ELFCLASS64
前阵子在ubuntu上搭载安卓的开发环境(Eclipse+Sdk+Adt),搭载是完成了,但是却出现了该问题: aapt: error while loading shared libraries: ...
- PAT (Advanced Level) 1078. Hashing (25)
二次探测法.表示第一次听说这东西... #include<cstdio> #include<cstring> #include<cmath> #include< ...
- iOS 程序间跳转传参(支付和地图)
两个APP之间的跳转是通过[[UIApplication sharedApplication] openURL:url]这种方式来实现的. 1.首先设置第一个APP的url地址 2.接着设置第二个AP ...
- docker-compose 所带来的方便
docker-compose 是一款开源的docker 简化复杂容器环境的管理工具 . docker-compose 在结合Swarm 与 docker 进程化容器部署可以很方便的部署一套环境. 具体 ...
- 移动WEB模拟原声APP滑动删除
移动WEB模拟原声APP滑动删除 效果 代码 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- 《accelerated c++》---------第六章
本章主要讲了算法部分.就是<algoruthm>里面的算法.
- SpringMVC轻松学习-环境搭建(二)
基于spring2.5的采用XML配置的spring MVC项目 注:本项目全部基于XML配置.同时,集成了hibernate.采用的是:spring MVC+hibernate+spring的开发架 ...