EffectiveJava第十章第五节

线程安全性的文档化

并非出现synchronized关键字就是线程安全性文档化了。实际上,一个类支持的线程安全性有很多级别。一个类为了可被多个线程安全的使用,必须在文档中清楚的说明它所支持的线程安全性级别。

  • 不可变的(immutable):这个类的实例是不变的。所以,不需要外部的同步。这样的例子包括StringLongBigInteger
  • 无条件的线程安全(unconditionally thread-safe):这个类的实例是可变的。所以,但是这个类有着足够的内存同步,所以 ,它的实例可以被并发使用,无需任何外部同步。其例子包括RandomConcurrentHashMap
  • 有条件的线程安全(conditionally thread-safe):除了有些方法为进行安全的并发使用而需要外部同步之外,这种线程安全级别与无条件的线程安全同步。这样的例子包括Collections.synchronized包装返回的集合,他们的迭代器(iterator)要求外部同步。
  • 非线程安全(not thread-safe):这个类的实例是可变的。为了并发地使用它们,客户必须利用自己选择的外部同步包围每个方法调用(或者调用序列)。这样的例子包括通用的集合实现,例如ArrayListHashMap
  • 线程对立的(thread-hostile):这个类不能安全的被多个线程并发使用,即使所有的方法调用都被外部同步包围。这样情况在于这个类的方法要修改静态数据,而这些静态数据可能会影响到其他线程。这样的类在JAVA库中很少,例如:System.runFinalizersOnExit方法是线程对立的,但是已经废弃了。
      
      简而言之,每个类都应该字斟句酌的说明或者线程安全注解,清楚地在围挡中说明它的线程安全属性。synchronized修饰符与这个文档毫无关系。有条件的线程安全类必须在文档中指明“哪个方法调用序列需要外部同步,以及在执行这些序列的时候要获得哪把锁”。如果你编写的是无条件的线程安全类,就应该考虑使用私有锁对象来代替同步的方法。这样可以防止客户端程序和自雷的不同步干扰,让你能够在后续的版本中灵活地对并发控制采用更加复杂的方法。

你可能感兴趣的:(EffectiveJava第十章第五节)