
分析:
二者有啥区别,怎么看 都觉得 二者一摸一样,请大家分析分析 ThreadLocal 在什么场景下,用它比用 Thread 的局部变量好。
自写的测试代码:
public class ThreadLocalTest { private static final ThreadLocal<Integer> value = new ThreadLocal<Integer>() { @Override protected Integer initialValue() { return 0; } }; public static void main(String[] args) { for (int i = 0; i < 5; i++) { new Thread(new MyThread(i + "")).start(); } } static class MyThread implements Runnable { private String index; public MyThread(String index) { this.index = index; } //局部变量 private Integer num = 0; public void run() { System.out.println("线程" + index + "的初始 num:" + num); System.out.println("线程" + index + "的初始 value:" + value.get()); for (int i = 0; i < 10; i++) { num += i; value.set(value.get() + i); } System.out.println("线程" + index + "的累加 num:" + num); System.out.println("线程" + index + "的累加 value:" + value.get()); } } } 1 zhongxigeng OP 已自己找到了不同点,问的问题很 2 ,见谅~~ ```java public static void main(String[] args) { MyThread myThread = new MyThread("oo"); new Thread(myThread,"1").start(); new Thread(myThread,"2").start(); } static class MyThread implements Runnable { private String index; public MyThread(String index) { this.index = index; } //局部变量 private Integer num = 0; public void run() { System.out.println("线程" + Thread.currentThread().getName() +index+ "的初始 num:" + num); System.out.println("线程" + Thread.currentThread().getName()+index + "的初始 value:" + value.get()); for (int i = 0; i < 10; i++) { num += i; value.set(value.get() + i); } System.out.println("线程" + Thread.currentThread().getName() +index + "的累加 num:" + num); System.out.println("线程" + Thread.currentThread().getName() +index + "的累加 value:" + value.get()); } } ``` 结果: ``` 线程 2oo 的初始 num:0 线程 1oo 的初始 num:0 线程 2oo 的初始 value:0 线程 1oo 的初始 value:0 线程 2oo 的累加 num:45 线程 1oo 的累加 num:90 线程 1oo 的累加 value:45 线程 2oo 的累加 value:45 ``` 结论:自定义私有局部变量 线程不安全,当上述情况时 |
2 8bit 2016-07-21 17:29:54 +08:00 via Android threadlocal 用来处理全局变量的共享问题,局部变量在一定范围内就是线程封闭的呀 |
3 aabbccli 2016-07-21 20:01:28 +08:00 你可以把它看作是一个全局的 MAP,KEY 为线程 ID , VALUE 为对应线程设置的值 |
4 hinkal 2016-07-21 20:10:55 +08:00 via Android 我也思考过这个问题,应用场景区别就是,使用线程局部存储后,可以对所有线程都调用同样的变量名啊 |
5 lululau 2016-07-21 20:16:22 +08:00 via iPhone 第二个只是对象的私有实例变量好吗,和线程有啥关系 |
6 hinkal 2016-07-21 20:21:31 +08:00 via Android 补充,刚才回答以为是 win32API 请自动忽略... |
7 Override 2016-07-21 21:26:36 +08:00 via Android 我仿佛又听到有人在背后偷偷 @我 |
8 wangyunbin1989 2016-07-22 15:06:49 +08:00 ThreadLocal 类似于一个线程中的全局变量 |