第82条 线程安全性的文档化
-
一个方法中出现 synchronized 修饰符,这是个实现的细节,并不是 API 的一部分
-
类为了可以被多个线程安全地使用,必须在文档中清楚地说明它所支持的线程安全的级别
-
不可变的(immutable)
String
、Long
、BigInteger
-
无条件的线程安全(Unconditionally thread-safe) 这个类的实例是可变的,但是这个类有着足够的内部同步,所以,它的实例可以被并发使用,无需任何外部同步。比如
AtomicLong
和ConcurrentHashMap
-
有条件的线程安全(Conditionally thread-safe) 除了有些方法为进行安全的并发使用而需要外部同步之外,这种线程安全级别与无条件的线程安全相同。比如
Collections.synchronized
-
非线程安全(not thread-safe)
ArrayList
、HashMap
- 线程对立的(thread-hostile) 比如全局唯一的主键
-
不可变的(immutable)
-
为了避免拒绝服务攻击,应该使用一个私有锁对象(private lock object)来代替同步的方
private final Object lock = new Object(); public void foo() { synchronized(lock) { ... } }
-
锁的域应该始终声明为final
思考
-
ConcurrentHashMap
并不是所有方法都是现成安全的,只不过写操作基本都是线程安全的 - 加
lock
的同时,一定在同步代码块的例外都判断一次是否需要执行同步代码块里面的内容
网友评论