上文提到,「多个线程」「读写」「共享资源」时发生了指令交错,就可能出现线程安全问题。
根据线程安全问题出现的条件,可以从以下三个角度分析:
总的来说,看 多线程操作的是否为同一个共享资源,即可判断是否线程安全。
public class Test{
static int param1 = 0;
int param2 = 0;
// 该方法对共享资源param1执行了读写,不安全
public void unsafeFunction1(){
param1 += 1;
}
// 同上
public void unsafeFunction2(){
param2 += 1;
}
// 操作只读,因此是安全的
public void safeFunction1(){
System.out.println(param1);
}
// param3是局部变量,不会被外部访问,因此是安全的
public void safeFunction2(){
int param3 = 0;
param3 += 1;
}
}
String、Integer等都是不可变类,这些类底层数据是被 final 修饰的,所有的操作要么只读,要么创建一个新的对象,因此它们的方法都是线程安全的。