java并发编程:volatile关键字解析-java开发java经验技巧

java并发编程:volatile关键字解析-java开发java经验技巧

ID:30777697

大小:754.32 KB

页数:18页

时间:2019-01-03

java并发编程:volatile关键字解析-java开发java经验技巧_第1页
java并发编程:volatile关键字解析-java开发java经验技巧_第2页
java并发编程:volatile关键字解析-java开发java经验技巧_第3页
java并发编程:volatile关键字解析-java开发java经验技巧_第4页
java并发编程:volatile关键字解析-java开发java经验技巧_第5页
资源描述:

《java并发编程:volatile关键字解析-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java并发编程:volatile关键字解析-编程开发技术Java并发编程:volatile关键字解析原文出处:海了volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java5后,volatile关键字才得以重获生机。volatile关键字虽然从字面上理解起來比较简单,但是要用好不是一件容易的事情。ft]T*volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先來了解一下与内存模型相关的概念和知识,然后分析了vo

2、latile关键字的实现原理,最后给出了几个使用volatile关键字的场景。以下是本文的目录大纲:内存模型的相关概念二.并发编程中的三个概念三.Java内存模型四••深入剖析volatile关键字五•使用volatile关键字的场景若有不正之处请多多谅解,并欢迎批评指正。请尊重作者劳动成果,转载请标明原文链接:http://www.cnblogs.com/dolphin0520/p/3920373.html一.内存模型的相关概念大家都知道,计算机在执行程序时,毎条指令都是在CPU中执行的,而执行指令过程屮,势必涉及到数据的读取和写入。由于程序运行过程

3、屮的临吋数据是存放在主存(物理内存)当中的,这吋就存在一个问题,出于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起來要慢的多,因此如果任何时候对数据的操作都耍通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。也就是,当程序在运行过程中,会将运算需耍的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以宜接从它的高速缓存读取数据和向其中写入数据,当运算结束Z后,再将高速缓存中的数据刷新到主存当中。举个简单的例子,比如下面的这段代码:i二i+1;当线程执行这个语句时,会先

4、从主存当中读取i的值,然后复制一份到高速缓存当中,然后CPU执行指令对i进行加1操作,然后将数据写入高速缓存,最后将高速缓存屮i最新的值刷新到主存当屮。这个代码在单线程中运行是没有任何问题的,但是在多线程中运行就会有问题了。在多核CPU中,每条线程可能运行于不同的CPU屮,因此每个线程运行吋有自己的高速缓存(对单核CPU來说,其实也会出现这种问题,只不过是以线程调度的形式來分别执行的)。本文我们以多核CPU为例。比如同时有2个线程执行这段代码,假如初始时i的值为0,那么我们希槊两个线程执行完Z后i的值变为2。但是事实会是这样吗?可能存在下面一种情况:初

5、始吋,两个线程分别读取i的值存入各自所在的CPU的高速缓存当中,然后线程1进行加1操作,然后把i的最新值1写入到内存。此时线程2的高速缓存当中i的值还是0,进行加1操作Z后,i的值为1,然后线程2把i的值写入内存。最终结果i的值是1,而不是2。这就是著名的缓存一致性问题。通常称这种被多个线程访问的变量为共享变量。也就是说,如果一个变量在多个CPU中都存在缓存(一般在多线程编程时才会出现),那么就可能存在缓存不一致的问题。为了解决缓存不一致性问题,通常来说冇以下2种解决方法:1)通过在总线加LOCK#锁的方式2)通过缓存一致性协议这2种方式都是硬件层面上

6、提供的方式。在早期的CPU当中,是通过在总线上加LOCK#锁的形式來解决缓存不一致的问题。因为CPU和其他部件进行通信都是通过总线來进行的,如杲对总线加LOCK#锁的话,也就是说阻塞了其他CPU对其他部件访问(如内存),从而使得只能冇一个CPU能使用这个变量的内存。比如上面例子中如果一个线程在执行i二i+1,如果在执行这段代码的过程屮,在总线上发出了LCOK#锁的信号,那么只有等待这段代码完全执行完毕之后,其他CPU才能从变量i所在的内存读取变量,然后进行相应的操作。这样就解决了缓存不一致的问题。但是上面的方式会有一个问题,由于在锁住总线期间,其他CP

7、U无法访问内存,导致效率低下。所以就出现了缓存一致性I•办议。最出名的就是Intel的MES1协议,MESI

8、办议保证了毎个缓存中使用的共享变量的副本是一致的。它核心的思想是:当CPU写数据吋,如果发现操作的变量是共享变量,即在其他CPU屮也存在该变量的副木,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现白己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。sn二.并发编程中的三个概念在并发编程中,我们通常会遇到以下三个问题:原了性问题,可见性问题,有序性问题。我们先看具体看一下这三个概念:1.

9、原子性原子性:即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因索打断,要么就都不执

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。