Java中Volatile的作用
Java中Volatile的作用
看了几篇博客,发现没搞懂。可是简单来说,就是在我们的多线程开发中。我们用Volatile关键字来限定某个变量或者属性时,线程在每次使用变量的时候。都会读取变量改动后的最新的值,即Volatile关键字保证了变量的可见性。可是。并不能保证变量的原子性。这就导致了volatile关键字的误用在并发的时候结果与我们的预期会是不一样的。能够看下例如以下代码:
package com.wrh.firstpro;
public class TestVolatile {
public volatile static int count = 0;
public static void inc() {
//这里延迟1毫秒,使得结果明显
try {
Thread.sleep(1);
} catch (InterruptedException e) {
}
count++;
}
public static void main(String[] args) {
//同一时候启动1000个线程,去进行i++计算。看看实际结果
for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
TestVolatile.inc();
}
}).start();
}
//这里我们休眠10秒钟。使得我们输出语句执行的时候全部子线程均已经执行完毕
try {
Thread.sleep(10*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//这里每次执行的值都有可能不同,可能为1000
System.out.println("执行结果:Counter.count=" + TestVolatile.count);
}
}
上面出现的结果每次执行的值都有可能不同。可能为1000,出现的原因:
对于可见性,Java提供了volatile关键字来保证可见性。
当一个共享变量被volatile修饰时,它会保证改动的值会马上被更新到主存,当有其它线程须要读取时,它会去内存中读取新值。而普通的共享变量不能保证可见性,由于普通共享变量被改动之后。什么时候被写入主存是不确定的,当其它线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。
另外,通过synchronized和Lock也能够保证可见性。synchronized和Lock能保证同一时刻仅仅有一个线程获取锁然后执行同步代码,而且在释放锁之前会将对变量的改动刷新到主存其中。
因此能够保证可见性。
可是:volatile不能保证对变量的操作是原子性,这就是导致上面的根本原因。
详细解说能够看这篇博客:http://www.cnblogs.com/dolphin0520/p/3920373.html(我看的几篇博客中解说volatile关键字解说的最清晰的了)
还能够看这里:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html
Java中Volatile的作用的更多相关文章
- Java中volatile的作用以及用法
volatile让变量每次在使用的时候,都从主存中取.而不是从各个线程的“工作内存”. volatile具有synchronized关键字的“可见性”,但是没有synchronized关键字的“并发正 ...
- 【转】java中volatile关键字的含义
java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...
- JAVA中protected的作用
JAVA中protected的作用 1.public:public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private:private表示私有,私有的意思就是 ...
- Java中hashCode的作用
转 http://blog.csdn.net/fenglibing/article/details/8905007 Java中hashCode的作用 2013-05-09 13:54 64351人阅 ...
- Java中Volatile关键字详解
一.基本概念 先补充一下概念:Java并发中的可见性与原子性 可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉.通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值, ...
- 深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因
声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/det ...
- 转:java中volatile关键字的含义
转:java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...
- java中volatile关键字的理解
一.基本概念 Java 内存模型中的可见性.原子性和有序性.可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉.通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有 ...
- Java中Volatile关键字详解(转载)
转载自:https://www.cnblogs.com/zhengbin/p/5654805.html 一.基本概念 先补充一下概念:Java 内存模型中的可见性.原子性和有序性. 可见性: 可见性是 ...
随机推荐
- js调试若干
主要是将 chrome调试工具 firebug的控制台对以下都有支持 consoleAPI https://developers.google.com/chrome-developer-tools ...
- HTML系列(一):创建HTML文档
从本学期开始我打算把我以前学的知识点系统地总结一下,先从HTML开始.(本系列内容总结自博文视点出版社•代码逆袭系列书籍,包括代码片段.) 一.HTML文档类型 HTML版本众多,浏览器如何得知使用的 ...
- iOS 7 标签栏控制器进行模态视图跳转后变成透明
要解决此问题,需要设置tabBar的如下属性: self.tabBar.translucent = NO;
- 【LINUX】SHELL syntax error:unexpected end of file
解决思路: DOS下文件和Linux下文件格式差异问题导致的. DOS下的文本文件是以\r\n作为断行标志的,表示成十六进制就是0D 0A.而Unix下的文本文件是以\n作为断行标志的,表示成十六进制 ...
- BZOJ 1097: [POI2007]旅游景点atr( 最短路 + 状压dp )
先最短路预处理, 然后状压就行了 -------------------------------------------------------------------------- #include ...
- Jps介绍以及解决jps无法查看某个已经启动的java进程问题【盗用】
1.jps的作用 jps类似linux的ps命令,不同的是ps是用来显示进程,而jps只显示java进程,准确的说是当前用户已启动的部分java进程信息,信息包括进程号和简短的进程command. 2 ...
- 加装 ImageMagick 性能更佳!
1. 下载 Download ImageMagick 以此文件ImageMagick-6.9.1-10-Q16-x64-dll-win进行,第二次开发的研发 2. 安装 Install ImageMa ...
- 堆排序(java实现)
public class Test04 { static int a[] = {9,8,7,6,5,4,3,2,1,11,12,10,19,18,17,16}; public static void ...
- (iOS)推送常见问题
1.为什么启动的时候出现 Did Fail To Register For Remote Notifications With Error的错误程序运行的时候出现下面的错误信息: did Fail T ...
- ie6与固定定位fixed,+ 条件注释格式注意
ie6并不支持position:fixed, ie7+都支持fixed定位, ie6固定定位实现方法1: <!DOCTYPE html> <html> <head> ...