int i=1;
Runnable r=()->System.out.println(i);
先來說下什麼是事實上的final。 如果我聲明瞭一個變量,且在後面不更改它的值,那麼那就是事實上的final。
我改下代碼
int i=1;
Runnable r=()->System.out.println(i);
i=2;
如果i是局部變量,那麼會編譯出錯。爲什麼
我們知道,實例變量是儲存在堆上面的,是線程貢獻的。而局部變量則是保存在棧上的,是線程不共享的。
Lambda是在一個線程當總使用的。java訪問局部變量的時候,實際上是去訪問他的副本。如果局部變量改變了,那訪問的也是之前的值。
所以java8就有了這個限制。