volatile型变量的特殊规则volatile是Java虚拟机提供的最轻量级的同步机制,当一个变量被定义成volatile后,它将具备两种特性,第一是保证此变量对所有线程的可见性,这里的“可见性”是指当一条线程改变了这个变量的值后,新值对于其他线程来说是可以立即得知的;第二个语义是禁止指令重排序,...
分类:
编程语言 时间:
2015-02-01 20:24:31
阅读次数:
296
常见的并发陷阱volatilevolatile只能强调数据的可见性,并不能保证原子操作和线程安全,因此volatile不是万能的。参考指令重排序volatile最常见于下面两种场景。a. 循环检测机制volatilebooleandone=false;while(!done){dosomething...
分类:
编程语言 时间:
2014-12-03 00:19:55
阅读次数:
319
在这个小结里面重点讨论原子操作的原理和设计思想。由于在下一个章节中会谈到锁机制,因此此小节中会适当引入锁的概念。在Java Concurrency in Practice中是这样定义线程安全的:当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替运行,并且不需要额外的同步及在调用方...
分类:
移动开发 时间:
2014-12-02 22:28:48
阅读次数:
259
这是一份完整的Java 并发整理笔记,记录了我最近几年学习Java并发的一些心得和体会。J.U.C 整体认识原子操作 part 1 从AtomicInteger开始原子操作 part 2 数组、引用的原子操作原子操作 part 3 指令重排序与happens-before法则原子操作 part 4 ...
分类:
编程语言 时间:
2014-12-02 22:12:28
阅读次数:
254
指令重排序对主存的一次访问一般花费硬件的数百次时钟周期。处理器通过缓存(caching)能够从数量级上降低内存延迟的成本这些缓存为了性能重新排列待定内存操作的顺序。也就是说,程序的读写操作不一定会按照它要求处理器的顺序执行。重排序的背景我们知道现代CPU的主频越来越高,与cache的交互次数也越来越...
分类:
移动开发 时间:
2014-11-06 12:32:02
阅读次数:
262
看过了很多介绍指令重排序的文章,可惜由于自己硬件和计算机理论知识缺乏,很难理解深层次的奥秘和实现原理。不过也有很多帖子,讲的浅显易懂,使用的例子很形象。大牛就是能用简单的解释和通俗的比喻,给我们讲明白很高深的东西。这里做个摘抄和总结,和大家分享下,希望大家能够对指令重排序有个形象的认识,不至于在并发编程中犯一些简单的错误。如果理解有错误,希望看到的大神指正。 从源码变成可以被机器(或虚拟机)识别的程序,至少要经过编译期和运行期。重排序分为两类:编译期重排序和运行期重排序,分别对应编译时和运行时环境。由于重排...
分类:
编程语言 时间:
2014-10-29 00:18:04
阅读次数:
712
转:http://www.blogjava.net/xylz/archive/2010/07/03/325168.html在这个小结里面重点讨论原子操作的原理和设计思想。由于在下一个章节中会谈到锁机制,因此此小节中会适当引入锁的概念。在Java Concurrency in Practice中是这样...
分类:
移动开发 时间:
2014-10-17 18:27:07
阅读次数:
233
并发编程
线程通信
共享内存和消息传递
线程同步
控制不同线程的执行顺序
java并发
基于共享内存模型指令重排序
编译器重排序处理器重排序
cpu重排序写缓存区(cache、寄存器)
内存屏障顺序一致性与Happens-before执行结果有序性
volatile
解决内存可见性问题
锁
lock 显示锁
可中断可定时...
分类:
编程语言 时间:
2014-07-25 11:24:11
阅读次数:
275