Effective Java - 线程安全性的文档化

第82条 线程安全性的文档化

  1. 一个方法中出现 synchronized 修饰符,这是个实现的细节,并不是 API 的一部分

  2. 类为了可以被多个线程安全地使用,必须在文档中清楚地说明它所支持的线程安全的级别

    • 不可变的(immutable) StringLongBigInteger
    • 无条件的线程安全(Unconditionally thread-safe) 这个类的实例是可变的,但是这个类有着足够的内部同步,所以,它的实例可以被并发使用,无需任何外部同步。比如AtomicLongConcurrentHashMap
    • 有条件的线程安全(Conditionally thread-safe) 除了有些方法为进行安全的并发使用而需要外部同步之外,这种线程安全级别与无条件的线程安全相同。比如Collections.synchronized
    • 非线程安全(not thread-safe) ArrayListHashMap
    • 线程对立的(thread-hostile) 比如全局唯一的主键
  3. 为了避免拒绝服务攻击,应该使用一个私有锁对象(private lock object)来代替同步的方

    private final Object lock = new Object();
    public void foo() {
      synchronized(lock) {
        ...
      }
    }
    
  4. 锁的域应该始终声明为final

思考

  1. ConcurrentHashMap并不是所有方法都是现成安全的,只不过写操作基本都是线程安全的
  2. lock的同时,一定在同步代码块的例外都判断一次是否需要执行同步代码块里面的内容
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容