3.8 线程的安全性分析
- 成员变量和静态变量是否线程安全?
1、如果它们没有共享,则线程安全
2、如果它们被共享了,根据它们的状态是否能够改变,又分两种情况
2.1 如果只有读操作,则线程安全
2.2 如果读写操作,则这段代码是临界区,需要考虑线程安全
- 局部变量是否线程安全
1、局部变量是线程安全的
2、但局部变量引用的对象则未必
2.1 如果该对象没有逃离方法的作用访问,它是线程安全的
2.2 如果该对象逃离方法的作用范围,则需考虑线程安全
局部变量为什么是线程安全的。方法调用会产生栈帧,局部变量会放在栈帧的工作内存中,线程之间不共享,故不存在线程安全问题。
package com.sharing_model.thread_no_safe;
import java.util.ArrayList;
/**
* 线程不安全
*/
public class ThreadNoSafe {
static final int THREAD_NUMBER = 2;
static final int LOOP_NUMBER = 200;
public static void main(String[] args) {
ThreadUnsafe test = new ThreadUnsafe();
for (int i = 0; i < THREAD_NUMBER; i++) {
new Thread(() -> {
test.method1(LOOP_NUMBER);
}, "Thread" + (i+1)).start();
}
}
}
class ThreadUnsafe {
ArrayList<String> list = new ArrayList<>();
public void method1(int loopNumber) {
for (int i = 0; i < loopNumber; i++) {
method2();
method3();
}
}
private void method3() {
list.add("1");
}
private void method2() {
list.remove(0);
}
}