`
zhouchaofei2010
  • 浏览: 1114725 次
  • 性别: 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并发编程实战华章专业开发者书库 (Tim Peierls 等 美Brian Goetz).pdf

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

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

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

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

    java并发实战编程 英文版

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

    龙果 java并发编程原理实战

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

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

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

    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并发编程实战1

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

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

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

    java并发编程实践笔记

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

    Java并发编程实践多线程

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

    Java 并发编程原理与实战视频

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

    java高并发程序设计(原版电子书)

    10. **并发编程实战**:提供实际案例分析和练习,帮助读者将理论知识应用于实际项目,增强解决并发问题的能力。 11. **分布式并发**:简述在分布式系统中的并发问题,如分布式锁、分布式协调服务(如Zookeeper)...

    java高并发编程第一版

    《Java高并发编程》第一版是一本专注于...通过阅读《Java高并发编程》第一版,开发者不仅可以掌握Java并发编程的核心概念和技术,还能了解到如何在实际工作中设计和实现高效、安全的并发程序,提升系统的并发处理能力。

    Java并发编程实践.rar

    介绍Java并发编程中常用的集合框架,如ConcurrentHashMap、CopyOnWriteArrayList等,它们是如何在多线程环境下保证数据一致性与高效性的。 第五章:线程池 分析ExecutorService和ThreadPoolExecutor,解释如何配置...

    Java并发编程的艺术1

    11. 第11章提供并发编程实战案例,介绍问题排查方法。 本书适合已有一定Java基础和开发经验的读者,特别是Java开发工程师、架构师和并发编程爱好者。初学者可以按顺序阅读并实践书中的例子,有经验的读者则可根据...

    汪文君Java高并发实战编程

    1. **Java并发基础**:介绍Java并发编程的基础概念,包括线程的创建与启动,线程的生命周期,以及如何使用`Thread`类和`Runnable`接口。 2. **同步机制**:详述Java中的同步控制方法,如`synchronized`关键字,`...

Global site tag (gtag.js) - Google Analytics