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并发编程实战》是一本深入探讨Java平台并发编程的权威指南,由Tim Peierls等人与Brian Goetz合著,旨在帮助Java开发者理解和掌握在多线程环境中编写高效、安全的代码。这本书由拥有丰富经验的JDK并发大师及...
《Java并发编程实践》是Java开发者深入理解并发编程的重要参考资料,尤其对于想要提升多线程应用设计和性能优化技能的程序员来说,这本书提供了丰富的实践经验和深入的理论知识。以下是根据提供的章节内容概述的一些...
第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并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四...
本书还涉及到了Java并发工具类,如Semaphore信号量、CyclicBarrier栅栏、CountDownLatch倒计时器等,这些都是Java并发编程中的重要工具,可以帮助开发者更精细地控制线程执行。另外,书中还会介绍如何使用Future和...
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并发编程实战1》这本书深入探讨了Java平台上的并发编程技术。本书分为四个部分,旨在帮助读者理解和掌握如何在实际应用中有效地利用多线程。 第一部分的基础知识介绍了线程的基本概念。线程是程序执行的最小...
### 高并发编程实战1,2,3阶段 #### 知识点概览 本系列教程分为三个阶段,旨在帮助开发者全面理解并掌握高并发编程技术。通过理论讲解与实战演练相结合的方式,深入剖析了多线程编程的核心原理及其在实际项目中的...
20. **线程限制性的优点:** 通过限制类的状态,可以简化线程安全性的分析。 21. **充分的文档说明:** 并发程序需要更详尽的注释和文档,以便于理解和维护。 22. **使用外部对象作为监视器:** 在需要细分锁分配...
《Java并发编程实践》是一本深入探讨Java多线程编程的权威著作,它详细阐述了在并发环境下如何设计和实现高效、可靠的程序。这本书涵盖了Java并发编程的核心概念、工具和最佳实践,对于想要提升Java并发编程技能的...
java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个...
10. **并发编程实战**:提供实际案例分析和练习,帮助读者将理论知识应用于实际项目,增强解决并发问题的能力。 11. **分布式并发**:简述在分布式系统中的并发问题,如分布式锁、分布式协调服务(如Zookeeper)...
《Java高并发编程》第一版是一本专注于...通过阅读《Java高并发编程》第一版,开发者不仅可以掌握Java并发编程的核心概念和技术,还能了解到如何在实际工作中设计和实现高效、安全的并发程序,提升系统的并发处理能力。
介绍Java并发编程中常用的集合框架,如ConcurrentHashMap、CopyOnWriteArrayList等,它们是如何在多线程环境下保证数据一致性与高效性的。 第五章:线程池 分析ExecutorService和ThreadPoolExecutor,解释如何配置...
11. 第11章提供并发编程实战案例,介绍问题排查方法。 本书适合已有一定Java基础和开发经验的读者,特别是Java开发工程师、架构师和并发编程爱好者。初学者可以按顺序阅读并实践书中的例子,有经验的读者则可根据...
1. **Java并发基础**:介绍Java并发编程的基础概念,包括线程的创建与启动,线程的生命周期,以及如何使用`Thread`类和`Runnable`接口。 2. **同步机制**:详述Java中的同步控制方法,如`synchronized`关键字,`...