3 回答

TA貢獻2037條經(jīng)驗 獲得超6個贊
答案很簡單,您的變量在方法結束時超出了范圍。使用有效的最終變量可以輕松解決這個問題,因為編譯器只是將值復制到 lambda 中。由于 lambda 表達式中的代碼也可以在方法外部運行(其中可修改變量已被垃圾收集),因此這是行不通的。您也不能指望編譯器以某種方式復制您的變量,然后在 lambda 表達式之外修改它時動態(tài)更改它。我希望這能解決問題。

TA貢獻1880條經(jīng)驗 獲得超4個贊
想象一下您創(chuàng)建的 CompletableFuture 由 ForkJoinPool 或其他執(zhí)行器執(zhí)行的 lambda?
這就是為什么此方法上的同步不足以推翻局部變量有效為最終的規(guī)則。lambda 將同步執(zhí)行并同步,但它創(chuàng)建的異步任務不會。

TA貢獻1844條經(jīng)驗 獲得超8個贊
但編譯拋出了一個錯誤,指出它必須是最終的或有效的最終的。
那是因為它是按照規(guī)則進行的。不,是,沒有但是;您是否真正防范了所有并發(fā)問題并不重要 - 如果它不是有效的最終版本,它就不會編譯。
在您這里的簡單示例中,可能沒問題。然而,使方法同步是無關緊要的,因為無論如何局部變量總是與它們的每線程調(diào)用相關聯(lián)。編譯器擔心的是方法本身上下文中的線程問題,并且在使用 lambda 時很容易發(fā)生這種情況(在非最終變量的狀態(tài)可能發(fā)生變化之后,可能會在將來的任意時間執(zhí)行) ,如果有的話,根本不清楚應該使用什么狀態(tài) - 初始狀態(tài)還是更新后的狀態(tài)。)
添加回答
舉報