报错内容
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) {
......
}
}