成员变量和静态变量是否线程安全?
- 如果没有共享,则线程安全
- 如果它们共享了,根据它们的状态是否能够改变,又分两种情况
- 如果只有读操作,则线程安全
- 如果有读写操作,则这段代码是临界区,需要考虑线程安全
局部变量是否线程安全?
- 局部变量是线程安全的
- 但是局部变量引用的对象则未必
- 如果该对象没有逃离方法的作用访问,它是线程安全的
- 如果该对象逃离方法的作用范围,则需要考虑线程安全
局部变量线程安全分析:
public static void test1(){
int i=10;
i++;
}
每个线程调用test1()方法时局部变量i会在每个线程的栈帧内存中被创建多份,因此不存在共享
局部变量的引用稍有不同:如果该引用的作用域在方法之内,引用对象没有暴露给外部,那么是线程安全的,但是如果暴露给外部,那么需要考虑线程安全问题
常见线程安全类
String、Integer、StringBuffer、Random、Vector、Hashtable、java.util.concurrent包下的类
这里说它们是线程安全的是指,多个线程调用它们同一个实例的方法时,是线程安全的,也可以理解为:
- 它们的每个方法是原子的
- 但是注意它们多个方法的组合不是原子的
不可变类线程安全
- String、Integer等都是不可变的,因为其内部的状态不可以改变,因此它们的方法都是线程安全的
- 保护性拷贝