ThreadLocal不是用来解决共享对象的多线程访问问题的,
通过ThreadLocal的set()方法设置到线程的ThreadLocal.ThreadLocalMap里的是是线程自己要存储的对象,其他线程不需要去访问,也是访问不到的。各个线程中的ThreadLocal.ThreadLocalMap以及ThreadLocal.ThreadLocal中的值都是不同的对象。
set仅仅是表示将线程ThreadLoaclMap中table处的value值重新设置,即覆盖。
对于同一个ThreadLocal对象而言,set后,table中绝不会多出一个数据:
1 2 3 4 | public class Tools { public static ThreadLocal new ThreadLocal } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class ThreadLocalThread extends Thread { private static AtomicInteger ai &#61; new AtomicInteger(); public ThreadLocalThread(String name) { super (name); } public void run() { try { for ( int i &#61; 0 ; i < 3 ; i&#43;&#43;) { Tools.t1.set(ai.addAndGet( 1 ) &#43; "" ); System.out.println( this .getName() &#43; " get value--->" &#43; Tools.t1.get()); Thread.sleep( 200 ); } } catch (InterruptedException e) { e.printStackTrace(); } } } |
1、ThreadLocal不是集合&#xff0c;它不存储任何内容&#xff0c;真正存储数据的集合在Thread中。ThreadLocal只是一个工具&#xff0c;一个往各个线程的ThreadLocal.ThreadLocalMap中table的某一位置set一个值的工具而已2、同步与ThreadLocal是解决多线程中数据访问问题的两种思路&#xff0c;前者是数据共享的思路&#xff0c;后者是数据隔离的思路
3、同步是一种以时间换空间的思想&#xff0c;ThreadLocal是一种空间换时间的思想
4、ThreadLocal和request区别&#xff1a;
&#xff08;1&#xff09;ThreadLocal只能存一个值&#xff0c;一个Request由于是Map形式的&#xff0c;可以用key-value形式存多个值
&#xff08;2&#xff09;ThreadLocal一般用在框架&#xff0c;Request一般用在表示层、Action、Servlet