Java并发 | 15.[基础] 线程安全分析
文章目录
- 1. 线程安全概念
- 2. 分析一段代码块是否是线程安全的
- 基本分析
- 不可变类线程安全问题
- 参考资料
1. 线程安全概念
上文提到,「多个线程」「读写」「共享资源」时发生了指令交错,就可能出现线程安全问题。
2. 分析一段代码块是否是线程安全的
根据线程安全问题出现的条件,可以从以下三个角度分析:
- [多个线程] 如果这段代码块不会被多线程执行,那必然是线程安全的;
- [读写] 若这段代码块只读,那必然是线程安全的;
- [共享资源] 若这段代码涉及的资源不共享(eg:线程私有),那必然是安全的。
总的来说,看 多线程操作的是否为同一个共享资源,即可判断是否线程安全。
基本分析
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 修饰的,所有的操作要么只读,要么创建一个新的对象,因此它们的方法都是线程安全的。
参考资料
[视频] 04.014-线程安全分析
[视频] 04.015-线程安全分析-局部变量
[视频] 04.016-线程安全分析-局部变量引用
[视频] 04.017-线程安全分析-局部变量-暴露引用
[视频] 04.018-线程安全分析-常见类-组合调用
[视频] 04.019-线程安全分析-常见类-不可变
[视频] 04.020-线程安全分析-实例分析1~3
[视频] 04.021-线程安全分析-实例分析4~7