首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。


另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal.set()来实现的,而是通过每个线程中的new 对象 的操作来创建的对象,每个线程创建一个,不是什么对象的拷贝或副本。
过ThreadLocal.set()将这个新创建的对象的引用保存到各线程的自己的一个map中,每个线程都有这样一个map,执行
ThreadLocal.get()时,各线程从自己的map中取出放进去的对象,因此取出来的是各自自己线程中的对象,ThreadLocal实例是作
为map的key来使用的。 


如果ThreadLocal.set()进去的东西本来就是多个线程共享的同一个对象,那么多个线程的ThreadLocal.get()取得的还是这个共享对象本身,还是有并发访问问题。 



总结:  ThreadLocal.set()进去的对象会存在当前线程中的一个map中,并以当前ThreadLocal本身作为key,只能说这个map能保证唯一,map中存的对象如果是通过new存进去的话,没被另一个线程引用继续存入的话,则该对象对于该线程唯一,否则因是引用类型,可能存在多线程并发问题



测试代码:


  1. public static  ThreadLocal<String> threadLocal = new ThreadLocal<String>(); 
  2.   
  3.  public static void main(String[] args) { 
  4.    
  5.   Object[]  objects = new Object[]{1,2}; 
  6.   System.out.println(Arrays.toString(objects)); 
  7. //   
  8. // for (int i = 0; i< 10 ;i++) { 
  9. //    
  10. // final int j= i ; 
  11. // new Thread(new Runnable() { 
  12. //     
  13. // @Override 
  14. // public void run() { 
  15. //      
  16. // threadLocal.set(j+"-----------"+Thread.currentThread().getId()+"-----"+threadLocal.hashCode()); 
  17. // Thread.currentThread().getId(); 
  18. // try { 
  19. // Thread.currentThread().sleep(1000); 
  20. // } catch (InterruptedException e) { 
  21. // // TODO Auto-generated catch block 
  22. // e.printStackTrace(); 
  23. // } 
  24. // System.out.println(threadLocal.get()+"----------"+Thread.currentThread().getId()+"------"+"-----"+threadLocal.hashCode()); 
  25. // } 
  26. // }).start(); 
  27. // }

java 中的 ThreadLocal的更多相关文章

  1. Java中的ThreadLocal深入理解

    提到ThreadLocal,有些Android或者Java程序员可能有所陌生,可能会提出种种问题,它是做什么的,是不是和线程有关,怎么使用呢?等等问题,本文将总结一下我对ThreadLocal的理解和 ...

  2. 理解Java中的ThreadLocal

    提到ThreadLocal,有些Android或者Java程序员可能有所陌生,可能会提出种种问题,它是做什么的,是不是和线程有关,怎么使用呢?等等问题,本文将总结一下我对ThreadLocal的理解和 ...

  3. Java中的ThreadLocal详解

    一.ThreadLocal简介 多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线 ...

  4. 谈谈Java中的ThreadLocal

    什么是ThreadLocal ThreadLocal一般称为线程本地变量,它是一种特殊的线程绑定机制,将变量与线程绑定在一起,为每一个线程维护一个独立的变量副本.通过ThreadLocal可以将对象的 ...

  5. 理解java中的ThreadLocal(转)

    一.对ThreadLocal概述 JDK API 写道: 该类提供了线程局部 (thread-local) 变量.这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的 ...

  6. 理解java中的ThreadLocal 专题

    ThreadLocal每一印象: public class IncrementWithStaticVariable{ private static int seqNum = 0; public int ...

  7. Java中的ThreadLocal

    关于 ThreadLocal,我们经常用它来解决多线程并发问题,那它究竟是如何做到的?今天就让我们来好好看一下. 从源码入手 首先,让我们看看 ThreadLocal 类中的介绍: This clas ...

  8. Java中的ThreadLocal使用

    ThreadLocal用于下面的场景: 1. 不允许多个线程同时访问的资源 2. 单个线程存活过程只使用一个实例 官方定义如下: This class provides thread-local va ...

  9. Java ThreadLocal Example(java中的ThreadLocal例子)

    Java ThreadLocal is used to create thread local variables. We know that all threads of an Object sha ...

随机推荐

  1. java8 map flatmap

    map: 对于Stream中包含的元素使用给定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素.这个方法有三个对于原始类型的变种方法,分别是:mapToInt,mapToLong和ma ...

  2. mysql-cluster 7.3.5-linux 安装

    [集群环境] 管理节点    10.0.0.19 数据节点    10.0.0.12                    10.0.0.17 sql节点       10.0.0.18 10.0.0 ...

  3. python之poplib模块下载并解析邮件

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之poplib模块下载并解析邮件 #https://github.com/michaelliao ...

  4. samba温故知新

    SAMBA服务器可以实现Windows主机和Linux主机共享资源互访的功能,即在Windows下可以通过网上邻居访问Linux操作系统中SAMBA服务器共享的文件夹,当然,Linux操作系统之间同样 ...

  5. Axure 8.0.0.3312下载地址以及注册码

    下载地址: 链接: http://pan.baidu.com/s/1pKMPsJx 密码: gu8t Axure 8.0.0.3312可用注册码(仅供3312版本使用) 用户名:aaa 注册码:2GQ ...

  6. PHP中的一些安全配置

    PHP中的配置至关重要,包含php.ini的配置,还有系统权限的配置,一下是我总结的一些配置 一.PHP的模块 ./configure \ --with-libdir=lib64 \ --prefix ...

  7. Asp.Net中using的使用的方法(转)

    摘自:http://blog.sina.com.cn/s/blog_6aa9c73801018ggw.html 一.强制资源整理(实用性非常强,希望大家多多使用,比try-catch-finaly效率 ...

  8. Python中 append 和 extend 的区别

    Python中Lists 的两个方法: append 和 extend : list.append(object) 向列表中添加一个对象object.append 接受一个参数,这个参数可以是任何数据 ...

  9. [转]Splay Tree

    转自:http://blog.sina.com.cn/s/blog_7c4c33190100sg9r.html Splay Tree(又叫伸展树)本质上也是一棵二叉查找树.它不是严格平衡的,但通过一种 ...

  10. Ubuntu 10.04 安装Qt4.8.1 源码后字体模糊的问题

    Ubuntu 10.04 安装QT4.8.1 源码后字体模糊的问题. 附加解决 QT SDK 4.8.1 链接失败的问题 Ubuntu 10.04 编译QT源码后,编译程序,运行后IPA字体无法正常显 ...