找了很多资料,包括《java并发编程实战》,综合一下各家的说法就是: 1.volatile让变量每次在使用的时候,都从主存中取。而不是从各个线程的“工作内存”。 2.volatile具有synchronized关键字的“可见性”,但是没有synchronized关键字的“并发正确性”,也就是说不保证线程执行的有序性。也就是说,volatile变量对于每次使用,线程都能得到当前volatile变量的最新值。但是volatile变量并不保证并发的正确性。 看下面的例子: 假如count变量是volatile的。线程1,线程2 在进行read,load 操作中,发现主内存中count的值都是5,那么都会加载这个最新的值在线程1堆count进行修改之后,会write到主内存中,主内存中的count变量就会变为6,线程2由于已经进行read,load操作,在进行运算之后,也会更新主内存count的变量值为6,导致两个线程及时用volatile关键字修改之后,还是会存在并发的情况。 综合了查找到的资料,上面的解释,还算理解的过去。但是《java并发编程实战》上的例子,就不是很明白了。 看下面 java并发编程实战上说,如果变量不是volatile的,那么在被其他线程修改之后,之前的线程是不会感知到的。但是下面的代码,asleep被修改了之后,其他四个线程却都停止了输出。不明白是怎么回事。 [java] view plaincopy package comz; /** * 这段代码虽然没有volatile,但是另外的线程设置为true的时候,其他的四个线程依然停止了运行。 与书上不一致。为啥? * 书上说,如果不是volatile的,则另外的线程更新这个值的时候,其他的线程是不会感知到的。所以其他线程就不会停止执行。 * @author naughty * */ class T { public static boolean asleep = false; public static void main(String[] args) throws InterruptedException { for (int i = 0; i < 4; i++) { new Thread(new Runnable() { @Override public void run() { judge(); } }).start(); } Thread.sleep(3000); new Thread(new Runnable() { public void run() { asleep = true; System.out.println("end"); } }).start(); } public static void judge() { while (!asleep) { try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } CMS(); } } public static void CMS() { System.out.println("@"); } } 那么,我们这里说线程要先拷贝变量到自己的工作内存,然后再使用。在这里,什么是线程的工作内存呢?看看JLS(java语言规范)对线程工作内存的描述,线程的working memory只是cpu的寄存器和高速缓存抽 象描述。 本文由守望者watchmen收集整理,部分内容源于网络(http://blog.csdn.net/imzoer/article/details/8620801)。本文仅代表作者个人观点,不代表守望者的本意。如有违法侵权内容,请提交到守望者管理员处,立即处理。 |
行业聚焦 面试交流 职位推荐 开发视频 技术交流 腾讯微博 新浪微博
友情链接:课课家教育 阿里云 鲜果 W3Cfuns前端网 中国企业家 环球企业家 投资界 传媒梦工场 MSN中文网 Android开发者社区 cnbeta 投资中国网 又拍云存储 美通说传播 IT茶馆 网商在线 商业评论网 TechOrange IT时代周刊 3W创新传媒 开源中国社区 二维工坊 Iconfans 推酷 智能电视网 FreeBuf黑客与极客 财经网 DoNews 凤凰财经 新财富 eoe移动开发者社区 i黑马 网易科技 新浪科技 搜狐IT 创业家 创业邦 腾讯财经 福布斯中文网 天下网商 TechWeb 雷锋网 新浪创业 和讯科技 品途O2O 极客公园 艾瑞网 抽屉新热榜 卖家网 人民网通信频道 拉勾网 创新派 简单云主机
手机版|黑名单|守望者 成才网 在线教育 linux 高级程序设计 C/C++ 大数据
( 蜀ICP备14029946号 )
成都守望者科技有限公司 © 2013-2016 All Rights Reserved