1. 程式人生 > 其它 >執行緒的安全性分析

執行緒的安全性分析

技術標籤: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); } }

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-BH9EQscc-1607667894155)(C:/Users/lenovo/AppData/Roaming/Typora/typora-user-images/image-20201130200128049.png)]