【面试:并发篇13:多线程: 变量的线程安全分析】
00.前言
如果有任何问题请指出,感谢。
01.介绍
成员变量和静态变量是否线程安全?
如果它们没有共享,则线程安全
如果它们被共享了,根据它们的状态是否能够改变,又分两种情况 如果只有读操作,则线程安全 如果有读写操作,则这段代码是临界区,需要考虑线程安全
局部变量是否线程安全?
局部变量是线程安全的 但局部变量引用的对象则未必 如果该对象没有逃离方法的作用访问,它是线程安全的 如果该对象逃离方法的作用范围,需要考虑线程安全
02.成员变量线程安全分析
例子
import java.util.ArrayList;
class ThreadUnsafe {
ArrayList<String> list = new ArrayList<>();
public void method1(int loopNumber) {
for (int i = 0; i < loopNumber; i++) {
// { 临界区, 会产生竞态条件
method2();
method3();
// } 临界区
}
}
public void method2() {
list.add("1");
}
public void method3() {
list.remove(0);
}
}
public class TestXCAQ {
static final int THREAD_NUMBER = 2;
static final int LOOP_NUMBER = 200