- 浏览: 780389 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (256)
- ssh (18)
- webservice (8)
- java基础 (38)
- j2EE方方面面 (17)
- 随意涂鸭!呵呵 (2)
- 数据库 (22)
- work (10)
- XML与XML解析 (9)
- 测试 (2)
- sso (1)
- ldap (6)
- java 模板技术 (4)
- 版本管理 (1)
- 每日小点滴 (26)
- javascript (26)
- Jakarta Commons (2)
- css (6)
- 设计 (3)
- Eclipse插件开发 (3)
- BAP (3)
- web控件 (2)
- java加密解密 (4)
- 调优 (6)
- 界面技术 (3)
- java多线程 (6)
- 互联网 (2)
- 日志管理 (4)
- java调度 (3)
- rest (0)
- Python (2)
- mobile (2)
- 2016的故事 (4)
- Docker (1)
- NOSQL_Hadoop (0)
最新评论
-
promiseloney:
这个女程序员厉害了。。。
JVM调优:GC 参数 -
zxjlwt:
可以通过WebService上传一个文件吗?素人派http:/ ...
webservice传送XML大小估算 -
liaoshaoyang:
写的不错嘛 可以做参考
权限管理设计一 -
aaaaaaaaabaas:
谢谢,对我有帮助
Apache Commons Configuration使用入门 -
Jack_Wilshere:
com.smartdot.pdm.business.corp. ...
java导出txt
我们知道,在Java中设置变量值的操作,除了long和double类型的变量外都是原子操作,也就是说,对于变量值的简单读写操作没有必要进行同步。
这在JVM 1.2之前,Java的内存模型实现总是从主存读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要。
在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。
要解决这个问题,只需要像在本程序中的这样,把该变量声明为volatile(不稳定的)即可,这就指示JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。一般说来,多任务环境下各任务间共享的标志都应该加volatile修饰。
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。
而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。
注:我在单例模式中用到此关键字.
volatile只能用在一个线程改,多个线程读的情况下,两个线程同时修改是不行的。
这在JVM 1.2之前,Java的内存模型实现总是从主存读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要。
在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。
要解决这个问题,只需要像在本程序中的这样,把该变量声明为volatile(不稳定的)即可,这就指示JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。一般说来,多任务环境下各任务间共享的标志都应该加volatile修饰。
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。
而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。
注:我在单例模式中用到此关键字.
评论
17 楼
qingfeng825
2013-09-04
kunsyliu 写道
漂亮姐姐,
如果两个线程同时要求修改呢????好像也会不一致啊!!!!
一个线程请求修改,读取了共享内存,但在完成写入前,
另一线程要求修改。会是什么情况????
如果两个线程同时要求修改呢????好像也会不一致啊!!!!
一个线程请求修改,读取了共享内存,但在完成写入前,
另一线程要求修改。会是什么情况????
volatile只能用在一个线程改,多个线程读的情况下,两个线程同时修改是不行的。
16 楼
snow8261
2013-01-07
写的不错
15 楼
qiuyu1990
2012-10-13
很好理解
14 楼
kunsyliu
2012-09-03
漂亮姐姐,
如果两个线程同时要求修改呢????好像也会不一致啊!!!!
一个线程请求修改,读取了共享内存,但在完成写入前,
另一线程要求修改。会是什么情况????
如果两个线程同时要求修改呢????好像也会不一致啊!!!!
一个线程请求修改,读取了共享内存,但在完成写入前,
另一线程要求修改。会是什么情况????
13 楼
zhanghh321
2011-07-26
12 楼
leiquanrui
2011-03-20
分析得很好啊,容易理解
11 楼
star022
2010-11-03
灰常强悍的女程序员~~
10 楼
xueyi_lee
2010-10-20
哇,楼主厉害呀,我佩服你,呵呵
9 楼
andyjackson
2010-10-03
8 楼
jaisok
2010-10-03
好好好好好好
7 楼
lwwin
2010-09-18
特地搜索了C# VOLATILE和 JAVA VOLATILE,没想到都有- -
女程很辛苦^-^
女程很辛苦^-^
6 楼
jeff2008
2010-08-04
5 楼
wjjxf
2010-07-22
4 楼
dracularking
2010-05-26
能问个问题吗 为什么要在单例中用volatile呢 除了eagerly created instance(饿汉式)外,uniqueInstance几乎都是被包围在synchronized关键字之下的
3 楼
spacefly
2009-07-21
哇,真正的女程序员哦,第一次见,
不过写的真的不错,赞一个,学习了
不过写的真的不错,赞一个,学习了
2 楼
yangzhihuan
2009-04-15
知道了java中有volatile关键字,多谢.
1 楼
flyinglife
2008-08-03
博主,原创的么?相当不错!
发表评论
-
Redis command
2019-07-05 09:43 0redis-cli -v : 查看redis version ... -
Spring Boot Actuator
2018-07-24 13:46 701Spring Boot : 2.0.3 POM文件中加入 ... -
java线程安全问题之静态变量、实例变量、局部变量
2017-07-04 14:50 488转载 java多线程编 ... -
关于CXF的FrontEnd和数据绑定方案
2013-06-17 11:45 1128转载自:http://blog.csdn.net/blui ... -
webservice传送XML大小估算
2013-06-06 12:22 77532013-06-06 某天,要做几个WebService, ... -
java-HashSet源码学习
2013-06-05 15:22 813HashSet: 不支持多线程 ... -
Java @override报错的解决方法 .
2013-04-28 09:59 820有时候Java的Eclipse工程换一台电脑后编译总是@ov ... -
myeclipse中的classpath .
2013-04-03 10:32 14946myeclipse中的classpath是 ... -
int i 引出JVM故事
2013-02-27 18:47 766public class TestDuanqf { ... -
java调度:(五) 用户自定义调度策略+spring+quartz
2013-02-22 18:21 0一般应该中,quartz的调度策略都是在xml配置文件中设 ... -
java内存系列:测试JDK最大内存
2013-02-22 18:09 1902JDK各个版本在不同操作系统中支持的最大内存是不一样的,但是可 ... -
java调度:(三)Timer中的单线程守护
2013-02-22 15:39 3624早听说Timer中是单守护 ... -
日志管理(一):slf4j原理简单介绍
2013-01-24 18:44 3052转载自:http://blog.sina.com.cn/s ... -
concurrent: wai notify notifyAll
2013-01-09 10:16 837转载自:http://sishuok.com ... -
JDK5--Annotation学习:基础(二)
2012-12-04 19:56 1033转载自:http://www.iteye.com/topic/ ... -
JDK5--Annotation学习:基础(一)
2012-12-04 19:29 1102转载连接:http://www.iteye.com/topic ... -
concurrent: ThreadPoolExecutor 用法
2012-09-03 15:19 2997thread pool一般被用来 ... -
concurrent: Callable用法
2012-09-03 14:23 1290转载自: http://auguslee.iteye.com/ ... -
java调度:(六)quarts_cron表达式
2012-07-31 13:59 1259七个域要记住,从左到 ... -
java压缩----使用sun JDK压缩--中文的文件名会是乱码
2012-07-13 14:27 1285经测试,文件名为中文 ...
相关推荐
java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java ...
Java 线程 volatile 关键字详解 Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。volatile 变量的同步性较差,但它有时更简单并且开销更低。volatile 变量可以被看作是一种 “程度较轻的 ...
Java中的`volatile`关键字是用来解决多线程环境下的可见性和有序性问题的。它确保了被`volatile`修饰的变量在任何线程中都具有最新的值,但并不保证线程安全,即不保证并发操作的原子性。 首先,我们要理解Java内存...
java volatile 关键字 学习
【Java面试题】volatile的作用
从JUC中的AQS引入,讲解Java volatile与AQS锁内存可见性
Java中的`volatile`关键字是多线程编程中一个非常重要的概念,它用于修饰变量,确保在并发环境下,多个线程可以正确地共享和同步数据。本文将深入探讨`volatile`关键字的工作原理、特性以及如何使用它来解决多线程中...
### Java并发编程:volatile关键字解析 #### 一、内存模型的相关概念 在深入了解`volatile`关键字之前,我们首先需要理解计算机内存模型的一些基本概念。在现代计算机系统中,CPU为了提高执行效率,会将频繁访问的...
java语言的volatile教程,java语言的volatile关键字到底怎么用
volatile
在Java中,`volatile`关键字是用于解决并发问题的一个关键工具。它主要提供以下两个功能: 1. **可见性**:当一个线程修改了一个`volatile`变量时,这个修改会立即对其他所有线程可见。这意味着一旦一个线程修改了`...
Java中的`volatile`关键字是用来修饰变量的,它主要用于解决多线程环境下的数据同步问题。在Java语言中,`volatile`变量提供了一种轻量级的同步机制,它确保了共享变量的可见性和有序性,但并不保证原子性。 **可见...
"Java中的Volatile关键字详解" Java中的Volatile关键字详解是Java中的一种关键字,用于保证线程之间的可见性、原子性和有序性。下面是对Java中的Volatile关键字详解的知识点总结: 一、基本概念 1. 可见性:可见...
Java中的`volatile`关键字是多线程编程中的一个重要概念,它的主要作用是确保共享变量的可见性和禁止指令重排序。本文将深入探讨`volatile`的关键特性、工作原理以及使用注意事项。 1. 可见性: `volatile`关键字...
c#、java、php等多语言解决方案源代码 Wafer - 快速构建具备弹性能力的微信小程序 https://github.com/tencentyun/wafer 重要: 1.第二步,可以在5分钟内实现; 2.成本3元(腾讯云支持微信小程序2017年推广期间,3...
volatile关键字在Java编程语言中扮演着重要的角色,特别是在多线程环境下的同步和可见性问题。它是Java内存模型(JMM)的一部分,用于确保共享变量的可见性和有序性,但不保证原子性。 1. **volatile的可见性**:当...
Java中的`volatile`关键字是一个非常重要的并发编程工具,它的主要作用是确保共享变量在多线程环境下的可见性和有序性。下面将详细解释`volatile`的关键特性、它如何解决并发问题以及相关的`happens-before`原则。 ...