1.无状态对象一定是线程安全的。ps:无状态指的是不含任何域,也不包含对其他域的引用。
2.要保持状态的一致性,就需要在单个原子操作中更新所有相关的状态变量。
3.对于可能被多个线程同时访问的可变状态变量,在访问它时都需要持有同一个锁,在这种情况下, 我们称状态变量是由这个锁保护的。
4.每个共享的和可变的变量都应该只由一个锁来保护。
5.当执行时间较长的计算或者可能无法快速完成的操作时,一定不要持有锁。
6.加锁的含义不仅仅局限于互斥行为,还包括内存可见性。为了确保所有线程都能看到共享变量的最新值,所有执行读操作或者写操作的线程都必须在同一个锁上同步。
7.加锁机制既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性。
ps:当且仅当满足以下所有条件时,才应该使用volatile变量:
- 对变量的写入操作不依赖变量的当前值,或者能确保只有单个线程更新变量的值。
- 该变量不会与其他状态变量一起纳入不变性条件中。
- 在访问变量时不需要加锁。
8.不要在构造过程中使this引用逸出。
9.不可变对象一定是线程安全的。
10.将数据封装在对象内部,可以将数据的访问限制在对象的方法上,从而更容易确保线程在访问数据时持有正确的锁。