四、对象的组合

一、设计线程安全的类
1、三个基本要素:

  • 找出构成对象状态的所有变量:理解为域(基本类型、引用)
  • 找出约束状态变量的不变性条件:用于判断状态是有效的还是无效的,eg. long value = 0 这个value域是long类型的变量,其状态空间从为Long.MIN_VALUE到Long.MAX_VALUE,但是不能为负值,这就是不可变的限制条件
  • 建立对象状态的并发性访问管理策略:就是不变性条件并发访问的情况下不被破坏

2、实例封闭
如果某对象不是线程安全的,那么可以通过多种技术使其在多线程程序中安全地使用。你可以确保该对象只能由单个线程访问(线程封闭),或者通过一个锁来保护对该对象的所有访问。

封装简化了线程安全类的实现过程,它提供了一种实例封闭机制(instance Confienement)。当一个对象被封装到另一个对象中时,能够访问被封装对象的所有代码路径都是已知的。

public class PersonSet {
   private final Set<Person> mySet = new HashSet<Person>();
   public synchronized void addPerson(Person p) {
       mySet.add(p);
   }
   public synchronized boolean containPerson(Person p) {
       return mySet.contains(p);
   }
}

3、Java监视器模式
 从线程封闭原则及其逻辑推理可以得出Java监视器模式。遵循Java监视器模式的对象会把对象的所有可变状态都封装起来,并由对象自己的内置锁来保护

public class PrivateLock {
  private final Object myLock = new Object();
  void someMethod() {
      synchronized (myLock) {
          //do something
      }
  }
}

参考:
https://www.cnblogs.com/zhaww/p/9306479.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 到目前为止, 我们已经介绍了关于线程安全与同步的一些基础知识。然而, 我们并不希望对每一次内存访问都进行分析以确保...
    好好学习Sun阅读 3,843评论 0 1
  • 前言:本章将介绍一些组合模式,这些模式能够使一个类更容易设计成线程安全的,并且在维护这些类时不会无意中破坏类的安全...
    伊凡的一天阅读 1,373评论 0 4
  • 一、QA 1、如何设计一个线程安全的类? 找出构成对象状态的所有变量如果在对象的域中引用了其他对象,那么该对象的状...
    tangyu_tyty阅读 1,724评论 0 0
  • 对象组合的意义 将一些现有的线程安全组件组合为更大规模的组件或程序,降低线程安全分析和维护的复杂度,提高线程安全的...
    WFitz阅读 1,837评论 0 0
  • 4.1 设计线程安全的类 找出构成对象状态的所有变量 找出约束状态变量的不变性条件 建立对象状态的并发访问管理策略...
    z锋阅读 3,573评论 0 1

友情链接更多精彩内容