A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 浪无痕-陈文坤 中级黑马   /  2013-8-3 09:52  /  1405 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜光 于 2013-8-4 10:17 编辑

      关于ThreadLocal问题,很多书解释的很浅显,哪个大神能深入点讲解一下,谢谢!

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1

查看全部评分

6 个回复

倒序浏览
http://baike.baidu.com/view/4498010.htm
很详细的
回复 使用道具 举报
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 的简单介绍。其内部具体实现可看其类实现。

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 赞一个!

查看全部评分

回复 使用道具 举报
hanrongle 发表于 2013-8-3 11:57
http://baike.baidu.com/view/4498010.htm
很详细的

谢谢,但是跟ThreadLocal源代码相比还是有点出入。再次感谢
回复 使用道具 举报
wang100753 发表于 2013-8-3 13:58
ThreadLocal这个类提供了一个线程本地的变量。这些变量在被共享访问的情况下在不同的线程里是独立的 ( 必须 ...

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

没事,都是一步一步慢慢来的,一定要多看视频,多记笔记。
回复 使用道具 举报
wang100753 发表于 2013-8-4 10:16
没事,都是一步一步慢慢来的,一定要多看视频,多记笔记。

呵呵, 受教了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马