譬如下面的 i, s 好像是能被新线程复制过去 这些变量有何注意事项吗,貌似强制需要时 final 的 如果不是 final 的呢?
public static void main(String[] args) {
int i = 0;
Set<String> s =new HashSet<>();
s.add("one");
new Thread(new Runnable() {
@Override
public void run() {
func(i, s)
}
}).start();
}
1
ysc3839 2017-10-11 18:17:01 +08:00 via Android
请说明编程语言。
|
2
WinterWu 2017-10-11 22:38:22 +08:00
1. 看起来是 Java 语言
2. 任何语言,线程间都在同一个进程内-同一个内存空间,所以变量当然也是共享,除了线程变量-这个需要特别指定。 |
4
georgetso 2017-10-11 22:53:56 +08:00
@esolve primitive types are value-passed while object types are reference-passed.
|
6
SoloCompany 2017-10-12 02:49:19 +08:00
你搞混了线程和闭包( lamdba ),你以为自己在问一个线程的问题,其实并不是,java 不支持可写的闭包变量而已,万能的解决办法就是 wrapper
|
7
esolve OP @SoloCompany 啊?没看懂你说什么。。。。
|
8
esolve OP @SoloCompany
我看了这篇文章 http://www.cnblogs.com/ssp2110/p/3797666.html 这里闭包涉及到的变量是类变量啊,不是线程栈内变量 而且是可以改变的变量,不是 final 的 |
9
esolve OP |
10
SoloCompany 2017-10-12 23:31:27 +08:00 1
@esolve 根本没有线程内变量这个概念,你还是不要跑偏了,Java 里面和线程变量有关的只有 ThreadLocal
|