匿名内部类是不能用外部变量的。
这是因为匿名内部类和外部变量并不在同一个工作空间。基本类型数据保存在栈里面,就得用地址不可变的引用类型。
Integer 也不行,因为值变了,意味着对象也变了。
原子类是引用类型,放在内部类当中将引用赋值到内部类对象所在的对中,而基本类型复制会有数据不一致问题。
问题现象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| package com.redisc;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
@Slf4j(topic = "c.Test") public class Run {
public static void main(String[] args) throws IOException { int i = 0; new Thread(() -> { i++; }); }
}
|
i++
会报错,因为在内部类中使用 i
,相当于默认 i
是 final
。
修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package com.redisc;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException; import java.util.concurrent.atomic.AtomicInteger;
@Slf4j(topic = "c.Test") public class Run {
public static void main(String[] args) throws IOException { AtomicInteger i = new AtomicInteger(); new Thread(() -> { i.getAndIncrement(); }); }
}
|