報錯內容
Error:(15, 36) java: 從lambda 表達式引用的本地變量必須是最終變量或實際上的最終變量
Error:(16, 34) java: 從lambda 表達式引用的本地變量必須是最終變量或實際上的最終變量
Error:(23, 36) java: 從lambda 表達式引用的本地變量必須是最終變量或實際上的最終變量
Error:(24, 34) java: 從lambda 表達式引用的本地變量必須是最終變量或實際上的最終變量
代碼示意
public class T01LockSupport {
static Thread t1 = null ;
static Thread t2 = null ;
public static void main(String[] args) {
char[] chars = GenerateChar.generateChar();
int[] ints = GenerateChar.generateNumber();
t1 = new Thread(()-> {
for (int i = 0; i < chars.length; i++) {
System.out.print(chars[i]);
LockSupport.unpark(t2);
LockSupport.park(t1);
}
});
t2 = new Thread(()-> {
for (int i = 0; i < ints.length; i++) {
LockSupport.park(t2);
System.out.print(ints[i]);
LockSupport.unpark(t1);
}
});
t1.start();
t2.start();
}
}
報錯截圖:
報錯原因
Lambda表達式規則
- 只能引用標記了 final 的外層局部變量,這就是說不能在 lambda 內部修改定義在域外的局部變量,否則會編譯錯誤。
- 局部變量可以不用聲明為 final,但是必須不可被后面的代碼修改(即隱性的具有 final 的語義)
- 不允許聲明一個與局部變量同名的參數或者局部變量。
由Lambda表達式規則第二條可知,局部變量為隱性final!,可以將局部變量移出方法區,變為類變量
解決辦法
public class T01LockSupport {
static Thread t1 = null ;//將Thread t1從方法里面移出到類下
static Thread t2 = null ;
public static void main(String[] args) {
......
}
}