线程安全性的文档化(70)

当一个类的实例或者静态方法被并发使用的时候,这个类的行为如何,安全

  • 是该类与客户端程序的行为约束
  • 若是文档中没有相关描述,那么可能致使未同步或过分同步的状况

并非说文档中出现Synchronized 就说明是线程安全并发

  • synchronized 可能仅仅是实现细节

线程安全是分多种级别的:dom

  • 一个类能够被多个线程安全的使用,必须在文档中清楚的说明其支持的安全级别
  • 常见情形安全级别划分:
    • 不可变:
      • 实例是不可变的,不须要外部的同步
      • 如:String、Long、BigInteger等
    • 无条件的线程安全:
      • 可变实例,内部拥有足够的同步,无需任何外部同步
      • 如:Random、ConcurrentHashMap
        • ConcurrentHashMap是线程安全的,
          • 将Map 分红16个segment,
          • 按照hash值对应key到某个segment
          • 每一个操做都是线程安全的
    • 有条件的线程安全:
    • 非线程安全:
      • 必须外部同步包围每一个方法调用,才能正常使用
      • 好比:ArrayList、HashMap
    • 线程对立的
      • 这个类不能安全的被多个线程并发调用,即便全部方法都被外部同步
      • 出现这种问题的根源在于,没有同步修改静态变量

公有同步锁、线程

  • 容许客户端程序以原子形式执行一个方法调用序列
  • 好比ConcurrentHashMap

私有同步锁对象

  • 客户端没法访问锁
  • 私有锁对象只能用到无条件线程安全类上

总结::blog

  • synchronized 注释与该类是否线程安全毫无关系
  • 无条件线程安全类,请使用私有锁来代替同步的方法
  • 有条件的线程安全类,必须在文档标明哪一个方法调用时须要外部同步
相关文章
相关标签/搜索