zoukankan      html  css  js  c++  java
  • java并发编程实战笔记---(第四章)对象的组合

    4.1设计线程安全的类

    包含三个基本要素:

    1.找出构成对象状态的所有变量

    2.找出约束状态变量的不变性条件

    2.简历对象状态的并发访问管理策略

    对象的状态: 域

    基本类型所有域, 引用类型包括被引用对象的域

    同步策略:不违背对象不变条件下对其状态的访问进行协同。

    同步策略规定了如何将不可变性,线程封闭,加锁机制结合起来维护线程的安全性,并且规定了那些变量由哪些锁保护,最好写正式文档。

    1.收集同步需求

    不变性条件中包含多个变量,任何访问相关变量的操作都需要持有保护这些变量的锁。

    2.依赖状态的操作

    如果某个操作中包含有依赖状态的先验条件,即为依赖状态的操作。例如集合中取值,需先判断集合不能为空。

    并发程序中先验条件可能会因为其他线程变为真,所以并发线程需等待,知道先验条件为真继续执行。

    Java中等待某个先验条件为真的机制(等待和通知机制)不容易,可以使用 现有类库中的类入 bolcking queue或者samephore等来实现依赖状态的行为。

    4.2实例封闭

    讲数据封装在对象内部,讲数据 的访问控制在方法上。

     ArrayList hashset 都不是线程安全的,但是有collections.synchronized()。

     封闭讲线程安全控制在类中 ,更小的范围内。  

    1. Java监视器模式

    会把对象的所有状态封装起来,并用对象的内置锁来保护状态。

    通过复制方式不发布对象

    4.3线程安全性的委托

    不独立则需要加锁

    3.发布底层的状态变量

     4.4在现有的线程安全类中添加功能:

    要考虑同步策略。

    如果扩展该类,需要确保是同一把锁,是否与父类中的同步策略一样。

     不是同一个锁,不行

     

     同步封装器类文档指出用的内置锁,所以直接用list对象做锁。

    这种客户端加锁很脆弱,将同步分布在多个类中。

     

    相当于用一个新的锁重写整个类。

    4.5

     总结:

  • 相关阅读:
    spring cloud alibaba +seata 实战中Error processing condition on io.seata.spring.boot.autoconfigure.问题总结
    Docker部署Elasticsearch及安装后自动关闭的问题
    SpringBoot10:Web开发静态资源处理
    SpringBoot09:整合MyBatis
    SpringBoot08:整合Druid
    SpringBoot07:整合JDBC
    SpringBoot06:自定义starter
    SpringBoot05:自动配置原理
    SpringBoot04:JSR303数据校验及多环境切换
    SpringBoot03:yaml配置注入
  • 原文地址:https://www.cnblogs.com/wuer888/p/6950524.html
Copyright © 2011-2022 走看看