`
zhouchaofei2010
  • 浏览: 1104625 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java并发编程实战-第2章-线程安全性

 
阅读更多

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.对象的共享

  

 

 

  

  

 

1
1
分享到:
评论

相关推荐

    《java并发编程实战》读书笔记-第2章-线程安全性

    《java并发编程实战》读书笔记-第2章-线程安全性,脑图形式,使用xmind8制作 包括引言、线程安全性定义、原子性、加锁机制、使用锁保护状态、活跃性与性能等内容

    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并发编程实战华章专业开发者书库 (Tim Peierls 等 美Brian Goetz).pdf

    《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南,由Tim Peierls等人与Brian Goetz合著,旨在帮助Java开发者理解和掌握在多线程环境中编写高效、安全的代码。这本书由拥有丰富经验的JDK并发大师及...

    Java并发编程实践-电子书1-9章pdf

    《Java并发编程实践》是Java开发者深入理解并发编程的重要参考资料,尤其对于想要提升多线程应用设计和性能优化技能的程序员来说,这本书提供了丰富的实践经验和深入的理论知识。以下是根据提供的章节内容概述的一些...

    Java并发编程实战2019.zip

    Java并发编程实战,第1章 简介,第2章 线程安全性 第3章 对象的共享 第4章 对象的组合 第5章 基础构建模块 第6章 任务执行 第7章 取消与关闭 第8章 线程池的使用 第9章 图形用户界面应用程序 第10章 避免...

    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并发编程实践.pdf

    ### Java并发编程实践 #### 一、并发编程基础 ##### 1.1 并发与并行的区别 在Java并发编程中,首先需要理解“并发”(Concurrency)和“并行”(Parallelism)的区别。“并发”指的是多个任务在同一时间段内交替...

    java并发实战编程 英文版

    通过学习《Java并发实战编程》,读者不仅可以掌握Java并发编程的基本原理,还能学习到实际开发中的最佳实践,从而编写出更加健壮、高效的并发代码。这本书对于提升Java开发者在并发领域的专业素养具有重要意义。

    实战Java高并发程序设计第二版随书代码

    《实战Java高并发程序设计》第二版是一本深入探讨Java多线程和并发编程的书籍。这本书涵盖了Java并发编程的核心概念和技术,旨在帮助开发者在实际项目中高效地处理高并发场景。随书附带的代码提供了丰富的示例,以便...

    汪文君JAVA多线程编程实战(完整不加密)

    本书还涉及到了Java并发工具类,如Semaphore信号量、CyclicBarrier栅栏、CountDownLatch倒计时器等,这些都是Java并发编程中的重要工具,可以帮助开发者更精细地控制线程执行。另外,书中还会介绍如何使用Future和...

    龙果 java并发编程原理实战

    龙果 java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四...

    Java并发编程实践 PDF 高清版

    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领域,并发编程是构建高性能、高效率系统的关键技术,对于软件开发...

    Java并发编程实战1

    《Java并发编程实战1》这本书深入探讨了Java平台上的并发编程技术。本书分为四个部分,旨在帮助读者理解和掌握如何在实际应用中有效地利用多线程。 第一部分的基础知识介绍了线程的基本概念。线程是程序执行的最小...

    高并发编程实战1,2,3阶段

    ### 高并发编程实战1,2,3阶段 #### 知识点概览 本系列教程分为三个阶段,旨在帮助开发者全面理解并掌握高并发编程技术。通过理论讲解与实战演练相结合的方式,深入剖析了多线程编程的核心原理及其在实际项目中的...

    java并发编程实践笔记

    20. **线程限制性的优点:** 通过限制类的状态,可以简化线程安全性的分析。 21. **充分的文档说明:** 并发程序需要更详尽的注释和文档,以便于理解和维护。 22. **使用外部对象作为监视器:** 在需要细分锁分配...

    Java并发编程实践多线程

    《Java并发编程实践》是一本深入探讨Java多线程编程的权威著作,它详细阐述了在并发环境下如何设计和实现高效、可靠的程序。这本书涵盖了Java并发编程的核心概念、工具和最佳实践,对于想要提升Java并发编程技能的...

Global site tag (gtag.js) - Google Analytics