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 内存模型中的可见性.原子性和有序性. 可见性: 可见性是 ...
随机推荐
- chrome扩展小试
chorme 扩展 小试 官方文档 http://developer.chrome.com/extensions 非官方中文文档 http://docs.lmk123.com/getstarted.h ...
- C++数组与指针
指向数组元素的指针 一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址.指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中) ...
- eclipse集成jetty开发web项目(不采用maven方式)
以前开发过程部署项目都是采用tomcat,偶然发现jetty,所以试了下,挺方便的,直切主题. 1.下载jetty,楼主使用的jetty8,地址http://download.eclipse.org/ ...
- load和ready
<一>ready和load ready先执行,load后执行 DOM文档加载的步骤: () 解析HTML结构. () 加载外部脚本和样式表文件. () 解析并执行脚本代码. () 构造HT ...
- [LeetCode]题解(python):108-Convert Sorted Array to Binary Search Tree
题目来源: https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/ 题意分析: 给出一个排好序的数组,根据这 ...
- (Problem 72)Counting fractions
Consider the fraction, n/d, where n and d are positive integers. If nd and HCF(n,d)=1, it is called ...
- java从c struct传来的字节数组中取值
public int getInt(byte[] array,int index) { return (array[index] & 0xff) | (array[index + 1] & ...
- 前端笔试题 JS部分
题目 http://www.itmian4.com/forum.php?mod=viewthread&tid=4540 http://www.itmian4.com/forum.php?mod ...
- ie的selectNodes函数和firefox的document.evaluate
selectNodes() 方法用一个 XPath 查询选择节点. nodeObject.selectNodes(query)query XPath 查询串. 包含了匹配查询的节点的一个 NodeL ...
- RESTClient 控件 从服务器获得数据集 REST
用TRESTClient控件调用REST架构服务 RESTClient控件返回数据集 用到的控件 RESTClient RESTRequest RESTResponseDataSetAdapter p ...