黑马程序员技术交流社区

标题: 关于ThreadLocal问题 [打印本页]

作者: 浪无痕-陈文坤    时间: 2013-8-3 09:52
标题: 关于ThreadLocal问题
本帖最后由 杜光 于 2013-8-4 10:17 编辑

      关于ThreadLocal问题,很多书解释的很浅显,哪个大神能深入点讲解一下,谢谢!
作者: hanrongle    时间: 2013-8-3 11:57
http://baike.baidu.com/view/4498010.htm
很详细的
作者: wang100753    时间: 2013-8-3 13:58
ThreadLocal这个类提供了一个线程本地的变量。这些变量在被共享访问的情况下在不同的线程里是独立的 ( 必须通过 get 和 set 方法来访问 ) 。

例子 1 :没有使用 Threadlocal 的情况:
  1. public class TestWithNoThreadLocal {

  2. public static int a = 0;




  3. public static void main(String[] args) {

  4. MyThread myThread = new MyThread();

  5. myThread.start();

  6. for ( int i = 0; i < 5; i++) {

  7. a = a + 1;

  8. System. out .println(Thread. currentThread ().getName() + ":" + a );

  9. }

  10. }

  11. public static class MyThread extends Thread {

  12. public void run() {

  13. for ( int i = 0; i < 5; i++) {

  14. a = a + 1;

  15. System. out .println(Thread. currentThread ().getName() + ":" + a );

  16. }

  17. }

  18. }




  19. }

复制代码
运行的一种结果如下:

main:2

Thread-0:2

main:3

Thread-0:4

main:5

Thread-0:6

main:7

Thread-0:8

main:9

Thread-0:10


在没有同步的机制下,该结果有不安全的情况发生是正常的,两个线程都得到 2 。下面请看用了 ThreadLocal 的效果。

例子 2 :使用了 Threadlocal 的情况:
  1. public class TestThreadLocal2 {

  2. private static ThreadLocal<Integer> a = new ThreadLocal<Integer>() {

  3. public Integer initialValue() { // 初始化,默认是返回 null

  4. return 0;

  5. }

  6. };




  7. public static void main(String args[]) {

  8. MyThread my;

  9. my = new MyThread();

  10. my.start();

  11. for ( int i = 0; i < 5; i++) {

  12. a .set( a .get() + 1);

  13. System. out .println(Thread. currentThread ().getName() + ":" + a .get());

  14. }

  15. }




  16. public static class MyThread extends Thread {

  17. public void run() {

  18. for ( int i = 0; i < 5; i++) {

  19. a .set( a .get() + 1);

  20. System. out .println(Thread. currentThread ().getName() + ":"

  21. + a .get());

  22. }

  23. }

  24. }

  25. }

复制代码
运行的一种结果如下:

main:1

Thread-0:1

main:2

Thread-0:2

main:3

Thread-0:3

main:4

Thread-0:4

Thread-0:5

main:5



如上是关于 ThreadLocal 的简单介绍。其内部具体实现可看其类实现。


作者: 浪无痕-陈文坤    时间: 2013-8-4 07:50
hanrongle 发表于 2013-8-3 11:57
http://baike.baidu.com/view/4498010.htm
很详细的

谢谢,但是跟ThreadLocal源代码相比还是有点出入。再次感谢
作者: 浪无痕-陈文坤    时间: 2013-8-4 07:52
wang100753 发表于 2013-8-3 13:58
ThreadLocal这个类提供了一个线程本地的变量。这些变量在被共享访问的情况下在不同的线程里是独立的 ( 必须 ...

非常感谢你花了这么多时间为我解答,可能跟我问的深入“有点差距”,呵呵,还是要感谢,顶顶顶
作者: wang100753    时间: 2013-8-4 10:16
浪无痕-陈文坤 发表于 2013-8-4 07:52
非常感谢你花了这么多时间为我解答,可能跟我问的深入“有点差距”,呵呵,还是要感谢,顶顶顶 ...

没事,都是一步一步慢慢来的,一定要多看视频,多记笔记。
作者: 浪无痕-陈文坤    时间: 2013-8-4 11:18
wang100753 发表于 2013-8-4 10:16
没事,都是一步一步慢慢来的,一定要多看视频,多记笔记。

呵呵, 受教了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2