定义
当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类就能表现出正确的行为,那么就称这个类时线程安全的。
状态与线程安全
1,无状态对象一定是线程安全的。
2,当无状态的类中添加一个状态时,如果该状态完全使用线程安全的对象(例如:AcomicLong)管理,则该类线程安全。
3,当状态变量的数量由一个变为多个时,即使每个状态都是线程安全的对象来管理,也未必线程安全。
与线程安全相关的名词
原子性:原子操作是指,对于访问同一个状态的所有操作(包括该操作本身)来说,这个操作是一个原子方式执行的操作
竞态条件: 当某个计算的正确性取决于多个线程的交替执行时序时,那么就会发生竞态条件。
复合操作: 我们将“先检查后执行”以及“读取-修改-写入”等操作统称为复合操作:包含了一组必须以原子方式执行的操作以确保线程安全性
内置锁
synchronized(lock){
//访问或修改由锁保护的共享状态
}
1,内置锁是支持重入的。
2,在有状态的对象中,可以使用锁来保护状态。
3,当用锁来保护状态时,如果一个操作中要调用多个方法来操作状态,那么,即使每个方法都是同步方法,也未必是线程安全的,仍然可能存在竞态条件。