`
zhouchaofei2010
  • 浏览: 1088035 次
  • 性别: 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并发编程实战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 7并发编程实战手册

    《Java 7并发编程实战手册》是Java 7并发编程的实战指南,介绍了Java 7并发API中大部分重要而有用的机制。全书分为9章,涵盖了线程管理、线程同步、线程执行器、Fork/Join框架、并发集合、定制并发类、测试并发应用...

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

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

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

    Java并发编程实战1

    第二章第二章 线程安全性线程安全性如果发现一个状态变量没有使用合适的同步,三种修复方法:不在线程之间共享该状态变量将状态变量修改为不可变的变量在访问状态变量是使

    龙果java并发编程完整视频

    第13节从Java字节码的角度看线程安全性问题00:25:43分钟 | 第14节synchronized保证线程安全的原理(理论层面)00:13:59分钟 | 第15节synchronized保证线程安全的原理(jvm层面)00:25:03分钟 | 第16节单例问题与...

    java并发编程

    第13节从Java字节码的角度看线程安全性问题00:25:43分钟 | 第14节sy nchronized保证线程安全的原理(理论层面)00:13:59分钟 | 第15节synchronized保证线程安全的原理(jvm层面)00:25:03分钟 | 第16节单例问题...

    蚂蚁java架构师(第七/八期含项目) |课件完整|完结无秘

    引领互联网最新技术潮流,手把手带您轻松月入2万+,三年逆袭Java互联网架构师的经验传授与您~ 〖课程目录〗: 01架构师必备技能之设计模式 02架构师必备安全技能 03从零开始学习多线程技术 04架构师必备技能并发编程...

    Spring.3.x企业应用开发实战(完整版).part2

    9.2.5 Spring使用ThreadLocal解决线程安全问题 9.3 Spring对事务管理的支持 9.3.1 事务管理关键抽象 9.3.2 Spring的事务管理器实现类 9.3.3 事务同步管理器 9.3.4 事务传播行为 9.4 编程式的事务管理 9.5 使用XML...

    Spring3.x企业应用开发实战(完整版) part1

    9.2.5 Spring使用ThreadLocal解决线程安全问题 9.3 Spring对事务管理的支持 9.3.1 事务管理关键抽象 9.3.2 Spring的事务管理器实现类 9.3.3 事务同步管理器 9.3.4 事务传播行为 9.4 编程式的事务管理 9.5 使用XML...

    asp.net知识库

    第2章 并发操作的一致性问题 (2) Using sqlite with .NET Visual Studio 2005 中的新 DataSet 特性 MySQL 和 .Net2.0配合使用 与DotNet数据对象结合的自定义数据对象设计 (二) 数据集合与DataTable 与DotNet数据对象...

Global site tag (gtag.js) - Google Analytics