设计线程安全的类

设计线程安全的类:

在设计线程安全类的过程中,需要包含以下三个基本要素:

  • 找出构成对象状态的所有变量;
  • 找出约束状态变量的不变性条件;
  • 建立对象状态的并发访问管理策略。

要分析对象的状态,首先从对象的域开始。如果对象中所有的域都是基本类型的变量,那么这些域将构成对象的全部状态。如果对象的域中引用了其他对象,则该对象的域包含被引用对象的域。

同步策略定义了如何在不违背对象的不变性条件和后验条件的情况下对其状态的访问操作进行协同。同步策略规定了如何将不可变性、线程封闭与加锁机制等结合起来以维护线程的安全性,并且还规定了哪些变量由哪些锁来保护。

收集同步需求:

在许多类中都定义了一些不可变条件,用来判断状态是有效的还是无效的。例如long类型的变量,其状态空间是Long.MIN_VALUE到Long.MAX_VALUE。但我们定义了一个类,该类中有一个long类型的计数器,则该long类型的变量存在一个限制,即不能为负值。

同样,在操作中还会包含一些后验条件来判断状态迁移是否是有效的。如计数器当前值为17,那么下一状态只能是16或18.当下一个状态需要依赖当前状态时,这个操作就必须是一个复合操作。

由于不变性条件和后验条件在状态和状态转换上添加了与许多限制,因此就需要额外的同步和封装。

如果不了解对象的不可变条件和后验条件,那么就不能确保线程安全性。要满足各种约束条件,就需要借助于原子性与封装性。

依赖状态的操作:

类的不变性条件和后验条件约束了在对象上有哪些状态和状态转换是有效的。在某些对象的方法中还包含一些基于状态的先验条件。例如不能从空队列中删除一个元素。如果在某个操作中包含有基于状态的先验条件,那么这个操作就被称为依赖状态的操作。

猜你喜欢

转载自my.oschina.net/HuoQibin/blog/1806471