具体解释java中的volatilekeyword
一、为什么要有volatilekeyword
预计非常多java刚開始学习的人都被volatile这个keyword迷惑过。尽管网上有非常多讨论volatile的文章,但它们有的过于讲述底层原理,而没有说明其应用场景,让刚開始学习的人看后还是一头雾水;有的过于使用类比解说。造成了一定的错误。这种文章更害人。以下,小弟试着分析下volatilekeyword的作用及使用方法。希望能给大家带来一定的启示。文中错误之处,请各位大神指正。
我们知道,在多线程编程中,多个线程在訪问共享变量时,必须进行必要的同步,否则非常可能产生错误。synchronizedkeyword能够用来提供这样的同步。该keyword主要将方法或者代码块设定为同步的方法或者同步的代码块。
这样的同步能够提供例如以下两个保证:
1、原子性。无论这种方法或者代码块被多少线程訪问。方法和代码块中的语句仅仅能作为一个总体运行,即当一个线程訪问一个同步方法时,仅仅有当方法运行完时,其它线程才干运行该方法。简单讲,就是一个线程一个线程来,并且必须所有运行完同步方法或代码块中的语句。
2、内存可见性。
这指的是一个线程在同步方法或者代码块中对共享变量做的不论什么改变,对随后的其它线程都是可见的。
这样的同步机制就像是一套严整的西装,非常标准,但就是穿起来有点别扭,开销也大。有时用起来不是非常方便,比方,在程序中有一个状态变量。被多个线程读取,我们仅仅要求每一个线程读取到的值都是最新值,并依据最新状态採取不同的操作。这样的情况下,java为我们提供了一个轻量级的解决方式,就是使用volatile。
二、volatilekeyword的作用是什么
volatile的英文意思是“易变的。不稳定的;(液体或油)易挥发的;爆炸性的;快活的。轻快的”。可见,单从字面上理解,volatile应该用在易变、不稳定的变量上。其实,确实如此,这个keyword的作用就是告诉编译器,凡是被该keyword声明的变量都是易变的、不稳定的。
所以不要试图对该变量使用缓存等优化机制,而应当每次都从它的内存地址中去读取值。
使用volatile标记的变量在读取或写入时不须要使用锁,这将降低产生死锁的概率,使代码保持简洁。
请注意。这里仅仅是说每次读取volatile的变量时都要从它的内存地址中读取。并没有说每次改动完volatile的变量后都要立马将它的值写回内存。也就是说volatile仅仅提供了内存可见性。而没有提供原子性。
三、什么时候使用volatilekeyword
知道了volatile的作用,我们也就知道了它应该用在哪些地方。
非常显然。最好是那种仅仅有一个线程改动变量。多个线程读取该变量的地方。
也就是对内存可见性要求高,而对原子性要求低的地方。
举个样例,我们写游戏时。常常须要定义一个游戏的状态变量,并在主线程中依据不同条件改动它。为了提高游戏执行效率,我们通常并发用多个线程处理程序数据。这些线程都要訪问游戏的状态变量,才干依据游戏状态进行对应的操作。这个时候用volatile就再合适只是了。
具体解释java中的volatilekeyword的更多相关文章
- 全面解释java中StringBuilder、StringBuffer、String类之间的关系
StringBuilder.StringBuffer.String类之间的关系 java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,在上一篇博文中我 ...
- 用画小狗的方法来解释Java中的值传递
在开始看我画小狗之前,咱们先来看道很简单的题目: 下面程序的输出是什么? Dog myDog = new Dog("旺财"); changeName(myDog); System. ...
- java中基本输入输出流的解释(flush方法的使用)
转自:http://fsz521job.itpub.net/post/5606/34827 网络程序的很大一部分是简单的输入输出,即从一个系统向另一个系统移动字节.字节就是字节,在很大程度上,读服务器 ...
- Java中JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释
上一篇说的是一个简单的应用,说明JNI是怎么工作的,这一篇主要来说一下,那个本地方法sayHello的参数的说明,以及其中方法的使用 首先来看一下C++中的sayHello方法的实现: JNIEXPO ...
- Java进阶(十五)Java中设置session的详细解释
Java中设置session的详细解释 简单通俗的讲session就是象一个临时的容器,用来存放临时的东西.从你登陆开始就保存在session里,当然你可以自己设置它的有效时间和页面,举个简单的例子: ...
- Java中名词的解释
在上一篇中说到了Java的四大特性,里面出现了很多名次,包括以后学习Java中也会出现很多常用到的名次,对初学者来说可能不知道是什么意思,或者是对这些刺耳的理解不是特别透彻,这里我就我自己的理解来解释 ...
- Java中的final具体解释以及用途实战
浅析Java中的finalkeyword 谈到finalkeyword,想必非常多人都不陌生.在使用匿名内部类的时候可能会经经常使用到finalkeyword. 另外.Java中的String类就是一 ...
- 关于高淇JAVA中SORM总结学习笔记详细个人解释
代码来源于高淇JAVA教学视频 谢谢高淇老师的教学. 因为自己在学习的过程中发现了很多困难点,总结下希望对自己接下来学框架提升.给像我一样得初学者方便. SORM框架是一个简单的ORM,关系对象映射, ...
- 【Java面试题】解释内存中的栈(stack)、堆(heap)和静态存储区的用法
Java面试题:解释内存中的栈(stack).堆(heap)和静态存储区的用法 堆区: 专门用来保存对象的实例(new 创建的对象和数组),实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型 ...
随机推荐
- js获取checkbox中所有选中值及input后面所跟的文本
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- 动态改变UIPopupList选项(NGUI)
NGUI的UIPopupList 可以通过修改items属性来动态改变菜单选项: public class popListvahnge : MonoBehaviour { public UIPopup ...
- Python开发接水果小游戏
我研发的Python游戏引擎Pylash已经更新到1.4了.如今我们就来使用它完毕一个极其简单的小游戏:接水果. 下面是游戏截图: 游戏操作说明:点击屏幕左右两边或者使用键盘方向键控制人物移动.使人物 ...
- MongoDB社区版本和企业版本差别
MongoDB社区版本和企业版本差异主要体现在安全认证.系统认证等方面,具体信息参考下表: 版本特性 社区版本 企业版本 JSON数据模型.自由模式 支持 支持 水平扩展的自动分片功能 支持 支持 内 ...
- ACM-尼姆博弈之取(m堆)石子游戏——hdu2176
取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- SpringMVC上传文件的三种方式(转载)
直接上代码吧,大伙一看便知 这时:commonsmultipartresolver 的源码,可以研究一下 http://www.verysource.com/code/2337329_1/common ...
- Android Service完全解析,关于服务你所需知道的一切(上)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...
- webpack 编译ES6插件babel-loader
1.安装babel-loader 参考:http://babeljs.io/docs/setup/#installation 进入项目目录执行安装命名: npm install --save-dev ...
- ci高级使用方法篇之连接多个数据库
在我们的项目中有时可能须要连接不止一个数据库.在ci中怎样实现呢? 我们在本地新建了两个数据库,例如以下截图所看到的: 改动配置文件database.php文件为例如以下格式(读者依据自己数据库的情况 ...
- 在Ubuntu Server是配置iptables防火墙
iptables 是一个安装在Ubuntu Server上的默认防火墙.在正常的ubuntu安装过程中,iptables是被安装上了的,但是它默认允许所有的流量(不管防火墙是否是无效的) 关于ipta ...