在線程里使用線程外的變量為什么一定要是final類型


public class CyclicBarrierDemo {
    public static void main(String[] args) {
        /*
        * 七龍珠
        * */
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
            System.out.println("召喚神龍");
        });
        for (int i = 0; i < 7; i++) {
            int finalI = i;
            new Thread(()->{
                System.out.println(finalI);
            },String.valueOf(i+1)).start();
            final int temp=i;
            new Thread(()->{
                System.out.println(temp);
            },String.valueOf(i+1)).start();
        }
    }
}

從上面代碼不難看出,直接在線程里面使用外部的變量是會提示報錯的!
idea提供的解決的辦法是用一個臨時變量來存儲
為什么要臨時變量來存儲值呢?
當存在大量線程的情況下,啟動線程的時間很短,啟動了不代表線程執行完結束了,因此線程本身生命周期還沒有結束,而for循環定義的臨時變量生命周期可能已經結束了,當線程里面使用這個變量的時候再來訪問就會出錯
從例子可以看出,for循環里面直接用臨時變量存儲就行了,拿為什么還要加final來修飾呢?
final定義的變量不能更改,在定義的時候就已經確定了值,單核cpu可能不存在這個問題,但是多核cpu並行處理這個線程的時候就可能會導致兩個線程訪問的是同一個變量,但是第一個線程本該訪問這個變量的值為1,由於某些原因中間延遲執行了,當要訪問這個變量的時候,已經被另外一個線程修改了這個變量的值,導致結果差強人意


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM