最新文章列表

锁的实现原理

 锁在多线程中是必不可少的,他给多线程提供了同步的功能,让多线程可以互斥的执行同步块,并具有可见性。  本文将从happens-before关系出发,结合ReentranLock源码,如何用内存屏障、CAS操作、LOCK指令实现锁的功能。 锁的happens-before关系 happens-before规则 程序顺序规则:在一个线程中,前面的操作happens-before后面的 ...
noble510520 评论(0) 有2738人浏览 2017-12-26 14:23

Volatile实现原理

 读写volatile变量就像是访问一个同步块一样,是原子的且是可见的,总是能访问到最新的值。 原子性  读写volatile变量是原子操作,但读写变量不就是一条指令的事吗(mov、ldr),难道这还可分?没错绝大多数变量读写都是原子的,除了在32位JVM下对long、double的读写,就不是原子的。这是因为在32位下,总线宽度就只有32bit,对64位数据的读写需要分两次进行,依次读 ...
noble510520 评论(0) 有1693人浏览 2017-12-25 11:36

内存屏障保证缓存一致性

 在前面内存系统重排序提到,“写缓存没有及时刷新到内存,导致不同处理器缓存的值不一样”,出现这种情况是糟糕的,所幸处理器遵循缓存一致性协议能够保证足够的可见性又不过多的损失性能。  缓存一致性协议给缓存行(通常为64字节)定义了个状态:独占(exclusive)、共享(share)、修改(modified)、失效(invalid),用来描述该缓存行是否被多处理器共享、是否修改。所以缓存一致性协议 ...
noble510520 评论(0) 有1103人浏览 2017-12-24 15:28

从源代码到Runtime发生的重排序

 源代码和Runtime时执行的代码很可能不一样,这是因为编译器、处理器常常会为了追求性能对改变执行顺序。然而改变顺序执行很危险,很有可能使得运行结果和预想的不一样,特别是当重排序共享变量时。  从源代码到Runtime需要经过三步的重排序: 编译器重排序  为了提高性能,在不改变单线程的执行结果下,可以改变语句执行顺序。  比如尽可能的减少寄存器的读写次数,充分利用局部性。像下面这 ...
noble510520 评论(0) 有619人浏览 2017-12-22 15:46

6. 内存屏障[转载]

原文地址  作者:Martin Thompson  译者:一粟   校对:无叶,方腾飞 本文我将和大家讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见的一项技术。 CPU使用了很多优化技术来实现一个目标:CPU执行单元的速度要远超主存访问速度。在上一篇文章 “Write Combing (合并写)”中我已经介绍了其中的一项技术。CP ...
jimmee 评论(0) 有666人浏览 2014-11-26 00:07

内存关卡/栅栏 ( Memory Barriers / Fences ) – 译

  原文地址:http://coderbee.net/index.php/concurrent/20131211/624   翻译自:Martin Thompson – Memory Barriers/Fences 在这篇文章里,我将讨论并发编程里最基础的技术–以内存关卡或栅栏著称,那让进程内的内存状态对其他进程可见。 CPU 使用了很多技术去尝试和适应这样的事实:CPU 执行单元 ...
wen866595 评论(0) 有2029人浏览 2013-12-23 20:37

Linux内核的内存屏障

文本详细介绍了linux 内存屏障的知识:系 https://www.kernel.org/doc/Documentation/memory-barriers.txt 文翻译 ============================ Linux内核的内存屏障============================ By: David Howells <dhowells@redh ...
诸葛不亮 评论(0) 有2574人浏览 2013-06-13 18:54

[并发译文]Java内存模型手册

原文地址:http://gee.cs.oswego.edu/dl/jmm/cookbook.html   作者:Doug Lea。由 JMM邮件组的成员提供帮助. dl@cs.oswego.edu.   译者:潘曦,丁一,古圣昌,欧振聪,方腾飞  校对:欧振聪,方腾飞   前言:从最初的探索至今已经有十年了。在此期间,很多关于处理器和语言的内存模型的规范和问题变得更清楚,更容易理解,但 ...
fantasy 评论(0) 有2057人浏览 2013-01-20 21:13

重排序与volatile的介绍和资料

  指令重排序       指令重排序的原因:对主存的一次访问一般花费硬件的数百次时钟周期。处理器通过缓存(寄存器、cpu缓存等)能够从数量级上降低内存延迟的成本这些缓存为了性能重新排列待定内存操作的顺序。也就是说,程序的读写操作不一定会按照它要求处理器的顺序执行。 一、编译期重排序 编译期重排序的典型就是通过调整指令顺序,在不改变程序语义的前提下,尽可能减少寄存器的读取、存 ...
heavensay 评论(0) 有3430人浏览 2012-03-20 17:00

最近博客热门TAG

Java(141744) C(73651) C++(68608) SQL(64571) C#(59609) XML(59133) HTML(59043) JavaScript(54919) .net(54785) Web(54514) 工作(54118) Linux(50905) Oracle(49875) 应用服务器(43289) Spring(40812) 编程(39454) Windows(39381) JSP(37542) MySQL(37267) 数据结构(36424)

博客人气排行榜

    博客电子书下载排行

      >>浏览更多下载

      相关资讯

      相关讨论

      Global site tag (gtag.js) - Google Analytics