Java内存模型FAQ(四)重排序意味着什么?

原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html 第四章

译者:Alex

在很多情况下,访问一个程序变量(对象实例字段,类静态字段和数组元素)可能会使用不同的顺序执行,而不是程序语义所指定的顺序执行。编译器能够自由的以优化的名义去改变指令顺序。在特定的环境下,处理器可能会次序颠倒的执行指令。数据可能在寄存器,处理器缓冲区和主内存中以不同的次序移动,而不是按照程序指定的顺序。
Read more

Java内存模型FAQ(二) 其他语言,像C++,也有内存模型吗?

原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html 第二章

译者:Alex

大部分其他的语言,像C和C++,都没有被设计成直接支持多线程。这些语言对于发生在编译器和处理器平台架构的重排序行为的保护机制会严重的依赖于程序中所使用的线程库(例如pthreads),编译器,以及代码所运行的平台所提供的保障。

Read more

Java内存模型Cookbook-前言

原文地址:http://gee.cs.oswego.edu/dl/jmm/cookbook.html

作者:Doug Lea。由 JMM邮件组的成员提供帮助. dl@cs.oswego.edu.

译者:潘曦,丁一,古圣昌,欧振聪,方腾飞  校对:欧振聪,方腾飞

前言:从最初的探索至今已经有十年了。在此期间,很多关于处理器和语言的内存模型的规范和问题变得更清楚,更容易理解,但还有一些没有研究清楚。本指南一直在修订、完善来保证它的准确性,然而本指南部分内容展开的细节还不是很完整。想更全面的了解, 可以特别关注下 Peter Sewell和 Cambridge Relaxed Memory Concurrency Group的研究工作。

这是一篇用于说明在JSR-133中制定的新Java内存模型(JMM)的非官方指南。这篇指南提供了在最简单的背景下各种规则存在的原因,而不是这些规则在指令重排、多核处理器屏障指令和原子操作等方面对编译器和JVM所造成的影响。它还包括了一系列遵循JSR-133的指南。本指南是“非官方”的文档,因为它还包括特定处理器性能和规范的解释,我们不能保证所有的解释都是正确的,此外,处理器的规范和实现也可能会随时改变。

  1. 指令重排 [译者:欧振聪]
  2. 内存屏障 [译者:潘曦]
  3. 多处理器 [译者:古圣昌]
  4. 指南        [译者:丁一]

JMM Cookbook(一)指令重排

原文地址:http://gee.cs.oswego.edu/dl/jmm/cookbook.html 第一章 译者:欧振聪 校对:李同杰

  1. 前言
  2. 指令重排
  3. 内存屏障
  4. 多处理器
  5. 指南

指令重排

对于编译器的编写者来说,Java内存模型(JMM)主要是由禁止指令重排的规则所组成的,其中包括了字段(包括数组中的元素)的存取指令和监视器(锁)的控制指令。

Volatile与监视器

JMM中关于volatile和监视器主要的规则可以被看作一个矩阵。这个矩阵的单元格表示在一些特定的后续关联指令的情况下,指令不能被重排。下面的表格并不是JMM规范包含的,而是一个用来观察JMM模型对编译器和运行系统造成的主要影响的工具。

Read more

并发译文翻译计划(一)

为了促进并发编程在中国的推广和研究,让更多的同学能阅读到国外的文献。所以打算将国外的编程文献翻译成中文,但是我一个人的精力有限,所以希望征集译者帮忙一起翻译。

Read more

Java内存模型FAQ

原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html  译者:Alex,方腾飞

目录

  1. 什么是内存模型?
  2. 其他语言,像c++,也有内存模型吗?
  3. JSR 133是什么?
  4. 重排序是什么?
  5. 旧内存模型有什么错误?
  6. 没有正确同步的含义是什么?
  7. 同步会做些什么呢?
  8. final字段如何改变它们的值?
  9. 在新的JMM下final字段是如何工作的?
  10. volatile是干什么用的?
  11. 新内存模型是否修复了双重锁检查问题?
  12. 如果我要实现一个JVM,我需要做什么?
  13. 为什么要关注JMM?

Java内存模型FAQ(一) 什么是内存模型

原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html 第一章 译者:方腾飞

在多核系统中,处理器一般有一层或者多层的缓存,这些的缓存通过加速数据访问(因为数据距离处理器更近)和降低共享内存在总线上的通讯(因为本地缓存能够满足许多内存操作)来提高CPU性能。缓存能够大大提升性能,但是它们也带来了许多挑战。例如,当两个CPU同时检查相同的内存地址时会发生什么?在什么样的条件下它们会看到相同的值?

Read more

并发编程推荐书籍和文章

1: java并发编程实战

Java并发编程实战

豆瓣地址:http://book.douban.com/subject/10484692/

2:多处理器编程的艺术

多处理器编程的艺术

豆瓣地址:http://book.douban.com/subject/3901836/

3:推荐系列文章

  1. IBM developerWorks 中国 : Java 多线程与并发编程专题 http://t.cn/SVFmtH
  2. 原阿里同事@武汉伢袁志俊 写的“探索并发编程”系列文章http://t.cn/aF7gqD
  3. 深入浅出java并发编程http://t.cn/hGJNqw by @饭饭泛

4:推荐精品文章

  1. 阿里同事悟时写的一种高效无锁内存队列的实现
  2. Hadoop并行计算原理与分布式并发编程 http://t.cn/zlsBCHk

聊聊并发(五)原子操作的实现原理

本文属于作者原创,原文发表于InfoQ:http://www.infoq.com/cn/articles/atomic-operation

1    引言

原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作” 。在多处理器上实现原子操作就变得有点复杂。本文让我们一起来聊一聊在Inter处理器和Java里是如何实现原子操作的。

Read more

聊聊并发系列文章

聊聊并发系列文章是我在InfoQ发表的并发编程连载文章。

  1. 聊聊并发(一)深入分析Volatile的实现原理
  2. 聊聊并发(二)Java SE1.6中的Synchronized
  3. 聊聊并发(三)Java线程池的分析和使用
  4. 聊聊并发(四)深入分析ConcurrentHashMap
  5. 聊聊并发(五)原子操作的实现原理
  6. 聊聊并发(六)ConcurrentLinkedQueue的实现原理
  7. 聊聊并发(七)Java中的阻塞队列
  8. 聊聊并发(八)Fork/Join框架介绍
  9. 聊聊并发(九)Java中的CopyOnWrite容器
  10. 聊聊并发(十)生产者消费者模式

未完待续。。。

聊聊并发(四)深入分析ConcurrentHashMap

本文是作者原创,发表于InfoQ:http://www.infoq.com/cn/articles/ConcurrentHashMap

术语定义

术语 英文 解释
哈希算法 hash algorithm 是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值。 
哈希表 hash table 根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址。

线程不安全的HashMap

因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。
Read more

聊聊并发(三)Java线程池的分析和使用

作者:方腾飞 原文发表于infoQ:http://www.infoq.com/cn/articles/java-threadPool

1.    引言

合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。

Read more

并发和并行有什么区别?

做并发编程之前,必须首先理解什么是并发,什么是并行,什么是并发编程,什么是并行编程。

并发(concurrency)和并行(parallellism)是:

  1. 解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
  2. 解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件
  3. 解释三:在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群

所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。

各位是如何理解并行和并发的呢?

聊聊并发(二)Java SE1.6中的Synchronized

本文属作者原创,原文发表于InfoQ:http://www.infoq.com/cn/articles/java-se-16-synchronized

1 引言

在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。

Read more

聊聊并发(一)深入分析Volatile的实现原理

本文属于作者原创,原文发表于InfoQ:http://www.infoq.com/cn/articles/ftf-java-volatile

引言

在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。它在某些情况下比synchronized的开销更小,本文将深入分析在硬件层面上Inter处理器是如何实现Volatile的,通过深入分析能帮助我们正确的使用Volatile变量。

Read more

return top