
譬如下面的 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 Oct 11, 2017 via Android 请说明编程语言。 |
2 WinterWu Oct 11, 2017 1. 看起来是 Java 语言 2. 任何语言,线程间都在同一个进程内-同一个内存空间,所以变量当然也是共享,除了线程变量-这个需要特别指定。 |
| img src="https://cdn.v2ex.com/gravatar/c58da970d8e4411b9924f2141c66c19a?s=48&d=retro" class="avatar" border="0" align="default" alt="esolve" data-uid="158345" /> | 3 esolve OP @WinterWu 变量不是线程栈内变量么。。。怎么可能共享? |
4 georgetso Oct 11, 2017 @esolve primitive types are value-passed while object types are reference-passed. |
6 SoloCompany Oct 12, 2017 你搞混了线程和闭包( 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 Oct 12, 2017 @esolve 根本没有线程内变量这个概念,你还是不要跑偏了,Java 里面和线程变量有关的只有 ThreadLocal |