執行緒的安全性分析
阿新 • • 發佈:2020-12-12
技術標籤:JUC
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);
}
}