1. 程式人生 > >為什麼lambda中用到的區域性變數需要為final

為什麼lambda中用到的區域性變數需要為final

 

區域性變數

區域性變數是儲存在棧上的,而棧上的內容在當前執行緒執行完成之後就會被GC回收掉。

 

lambda表示式

lambda表示式最終被處理為一個額外的執行緒去執行。絕對不是上面提到的執行緒。如果上面的執行緒執行完了,而這個執行緒又使用到了上面提到的區域性變數會出現錯誤。

 

為什麼 Lambda 表示式(匿名類) 不能訪問非 final  的區域性變數呢?因為例項變數存在堆中,而區域性變數是在棧上分配,Lambda 表達(匿名類) 會在另一個執行緒中執行。如果線上程中要直接訪問一個區域性變數,可能執行緒執行時該區域性變數已經被銷燬了,而 final 型別的區域性變數在 Lambda 表示式(匿名類) 中其實是區域性變數的一個拷貝。