java并发编程实战-第2章-线程安全性
2. 线程安全性
2.1 什么是线程安全性
线程安全类:当一个类被多个线程访问时,不管运行环境中如何调度,这些线程如何交替执行,并且在调用的代码部分不需要额为的同步或者协同。这个类为线程安全类
Thread-safe classes encapsulate any needed synchronization so that clients need not provide their own.
2.1.1. Example: A Stateless Servlet
Stateless objects are always thread-safe.
2.2 原子性
在有状态的servlet中,对状态变量count在多线程条件下,++count 这个应为原子性操作
The possibility of incorrect results in the presence of unlucky timing is so important in concurrent programming that it has a name: a race condition.
2.2.1 竞态条件
如何产生:当某个正确的结果取决于多个线程的交替执行的时序时,就会发生竞态条件
本质:通过基于一种可能失效的观察结果来做出判断或者执行某个计算
最常见类型:先检测后执行(check-then-act) (星巴克AB会见朋友例子)
2.2.2 示例:延迟初始化的竞态条件
LazyInitRace 如果应用在应用程序的注册表,可能丢失注册信息,或者对同一组注册对象表现不一致视图
@NotThreadSafe public class LazyInitRace { private ExpensiveObject instance = null; public ExpensiveObject getInstance() { if (instance == null) instance = new ExpensiveObject(); return instance; } }
错误的 单例 例子(错误的设计模式)
如上竞态条件,A和B两个线程可能同时看到instance都为null,两次访问可能得到连个不同的instance实例
UnsafeSequence 如果应用在持久化的数据中,会产生不同的对象有相同的id,违反了标识的完整性约束
@NotThreadSafe
public class UnsafeSequence {
private int value;
/** Returns a unique value. */
public int getNext() {
return value++;
}
}
2.2.3 复合操作
像++count,这种“读取-修改-写入”的操作统称为复合操作,复合操作应该是原子性的。
1、通过2.3的加锁机制
2、使用现有线程安全类AtomicLong
Listing 2.4. Servlet that Counts Requests Using AtomicLong.
@ThreadSafe
public class CountingFactorizer implements Servlet {
private final AtomicLong count = new AtomicLong(0);
public long getCount() { return count.get(); }
public void service(ServletRequest req, ServletResponse resp) {
BigInteger i = extractFromRequest(req);
BigInteger[] factors = factor(i);
count.incrementAndGet();
encodeIntoResponse(resp, factors);
}
}
Where practical, use existing thread-safe objects, like AtomicLong, to manage your class's state. It is simpler to reason about the possible states and state transitions for existing thread-safe objects than it is for arbitrary state variables, and this makes it easier to maintain and verify thread safety.
实际中,尽可能使用现有的线程安全类来管理类的状态
2.3 加锁机制
例子:UnsafeCachingFactorizer
To preserve state consistency, update related state variables in a single atomic operation
为了保持状态的一致性,则需在一个原子操作中更新所有的相关的状态变量
2.3.1 内置锁
java提供内置锁机制支持原子性:the synchronized block
these built-in locks are called intrinsic locks or monitor locks
2.3.2 重入
某个线程可以获得已经持有的锁
2.4 用锁来保护状态
对于所有可变的状态,都需要使用同一个锁来保护
如果所有方法都同步,会造成活跃性问题和性能问题
2.5 活跃性和性能
network or console I/O. 不要持有锁
3.对象的共享
相关推荐
《java并发编程实战》读书笔记-第2章-线程安全性,脑图形式,使用xmind8制作 包括引言、线程安全性定义、原子性、加锁机制、使用锁保护状态、活跃性与性能等内容
第2章 线程安全性 2.1 什么是线程安全性 2.2 原子性 2.2.1 竞态条件 2.2.2 示例:延迟初始化中的竞态条件 2.2.3 复合操作 2.3 加锁机制 2.3.1 内置锁 2.3.2 重入 2.4 用锁来保护状态 2.5 活跃性与性能 第...
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南,由Tim Peierls等人与Brian Goetz合著,旨在帮助Java开发者理解和掌握在多线程环境中编写高效、安全的代码。这本书由拥有丰富经验的JDK并发大师及...
《Java并发编程实践》是Java开发者深入理解并发编程的重要参考资料,尤其对于想要提升多线程应用设计和性能优化技能的程序员来说,这本书提供了丰富的实践经验和深入的理论知识。以下是根据提供的章节内容概述的一些...
Java并发编程实战,第1章 简介,第2章 线程安全性 第3章 对象的共享 第4章 对象的组合 第5章 基础构建模块 第6章 任务执行 第7章 取消与关闭 第8章 线程池的使用 第9章 图形用户界面应用程序 第10章 避免...
第2章 线程安全性 2.1 什么是线程安全性 2.2 原子性 2.2.1 竞态条件 2.2.2 示例:延迟初始化中的竞态条件 2.2.3 复合操作 2.3 加锁机制 2.3.1 内置锁 2.3.2 重入 2.4 用锁来保护状态 2.5 活跃性与性能 第...
### Java并发编程实践 #### 一、并发编程基础 ##### 1.1 并发与并行的区别 在Java并发编程中,首先需要理解“并发”(Concurrency)和“并行”(Parallelism)的区别。“并发”指的是多个任务在同一时间段内交替...
通过学习《Java并发实战编程》,读者不仅可以掌握Java并发编程的基本原理,还能学习到实际开发中的最佳实践,从而编写出更加健壮、高效的并发代码。这本书对于提升Java开发者在并发领域的专业素养具有重要意义。
《实战Java高并发程序设计》第二版是一本深入探讨Java多线程和并发编程的书籍。这本书涵盖了Java并发编程的核心概念和技术,旨在帮助开发者在实际项目中高效地处理高并发场景。随书附带的代码提供了丰富的示例,以便...
本书还涉及到了Java并发工具类,如Semaphore信号量、CyclicBarrier栅栏、CountDownLatch倒计时器等,这些都是Java并发编程中的重要工具,可以帮助开发者更精细地控制线程执行。另外,书中还会介绍如何使用Future和...
龙果 java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四...
2.1 什么是线程安全性 2.2 原子性 2.3 锁 2.4 用锁来保护状态 2.5 活跃度与性能 第3章 共享对象 3.1 可见性 3.2 发布和逸出 3.3 线程封闭 3.4 不可变性 3.5 安全发布 . 第4章 组合对象 4.1 设计线程安全的类 4.2 ...
《实战Java高并发程序设计》是一本专注于Java并发编程实践的书籍,试读版提供了前两章的内容,为读者提供了一个初步了解并发编程基础的窗口。在Java领域,并发编程是构建高性能、高效率系统的关键技术,对于软件开发...
《Java并发编程实战1》这本书深入探讨了Java平台上的并发编程技术。本书分为四个部分,旨在帮助读者理解和掌握如何在实际应用中有效地利用多线程。 第一部分的基础知识介绍了线程的基本概念。线程是程序执行的最小...
### 高并发编程实战1,2,3阶段 #### 知识点概览 本系列教程分为三个阶段,旨在帮助开发者全面理解并掌握高并发编程技术。通过理论讲解与实战演练相结合的方式,深入剖析了多线程编程的核心原理及其在实际项目中的...
20. **线程限制性的优点:** 通过限制类的状态,可以简化线程安全性的分析。 21. **充分的文档说明:** 并发程序需要更详尽的注释和文档,以便于理解和维护。 22. **使用外部对象作为监视器:** 在需要细分锁分配...
《Java并发编程实践》是一本深入探讨Java多线程编程的权威著作,它详细阐述了在并发环境下如何设计和实现高效、可靠的程序。这本书涵盖了Java并发编程的核心概念、工具和最佳实践,对于想要提升Java并发编程技能的...