《Java 并发核心编程》.pdf
文本预览下载声明
Java
Java
JJaavvaa 并发核心编程
内容涉及:
1、关于java并发
2、概念
3、保护共享数据
4、并发集合类
5线程
6、线程协作及其他
1 java
1 java
11、关于jjaavvaa并发
自从java 创建以来就已经支持并发的理念,如线程和锁。这篇指南主要是为帮助java 多线
程开发人员理解并发的核心概念以及如何应用这些理念。本文的主题是关于具有java 语言
风格的Thread、synchronized、volatile,以及J2SE5 中新增的概念,如锁(Lock)、原子性
(Atomics)、并发集合类、线程协作摘要、Executors。开发者通过这些基础的接口可以构建高
并发、线程安全的java应用程序。
2
2
22、概念
本部分描述的java并发概念在这篇DZoneRefard会被通篇使用。
从JVM 并发看CPU 内存指令重排序(Memory
Reordering):/illustrate-memory-reordering-in-cpu
java内存模型详解:/explain-java-memory-model-in-detail
概念 描述
JavaMemoryModel 在JavaSE5(JSR133)中定义的Java Memory Model(JMM)是为
Java内存模型 了确保当编写并发代码的时候能够提供 Java 程序员一个可用的
JVM 实现。术语JMM 的作用类似与一个观察同步读写字段的
monitor。它按照“happens-before order(先行发生排序)”的顺序—
可以解释为什么一个线程可以获得其他线程的结果,这组成了一个
属性同步的程序,使字段具有不变性,以及其他属性。
monitor Java 语言中,每个对象都拥有一个访问代码关键部分并防止其他对
Monitor 象访问这段代码的“monitor”(每个对象都拥有一个对代码关键部
分提供访问互斥功能的“monitor”)。这段关键部分是使用
synchronized 对方法或者代码标注实现的。同一时间在同一个
monitor 中,只允许一个线程运行代码的任意关键部分。当一个线
程试图获取代码的关键部分时,如果这段代码的monitor被其他线
程拥有,那么这个线程会无限期的等待这个monitor 直到它被其他
线程释放。除了访问互斥之外,monitor 还可以通过wait 和notify
来实现协作。
原子字段赋值 除了doubles和langs 之外的类型,给一个这些类型的字段赋值是一
Atomicfield 个原子操作。在JVM 中,doubles 和langs 的更新是被实现为2 个
assignment 独立的操作,因此理论上可能会有其他的线程得到一个部分更新的
结果。为了保护共享的doubles 和langs,可以使用volatile 标记这
个字段或者在synchronized修饰的代码块中操作字段。
竞争状态 竞争发生在当不少于一个线程对一个共享的资源进行一系列的操
Racecondition 作,如果这些线程的操作的顺序不同,会导致多种可能的结果。
数据竞争 数据竞争主要发生在多个线程访问一个共享的、non-final、
Datarace non-volatile、没有合适的synchronization限制的字段。Java内存模
型不会对这种非同步的数据访问提供任何的保证。在不同的架构和
机器中数据竞争会导致不可预测的行
显示全部