ThreadLocal工具類的使用(隔離思想)


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<String> t1 =  new  ThreadLocal<String>();
}

 

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 =  new  AtomicInteger();
 
     public  ThreadLocalThread(String name)
     {
         super (name);
     }
 
     public  void  run()
     {
         try
         {
             for  ( int  i =  0 ; i <  3 ; i++)
             {
                 Tools.t1.set(ai.addAndGet( 1 ) +  "" );
                 System.out.println( this .getName() +  " get value--->"  + Tools.t1.get());
                 Thread.sleep( 200 );
             }
         }
         catch  (InterruptedException e)
         {
             e.printStackTrace();
         }
     }
}
<wiz_tmp_tag class="wiz-block-scroll">
 

 

1、ThreadLocal不是集合,它不存儲任何內容,真正存儲數據的集合在Thread中。ThreadLocal只是一個工具,一個往各個線程的ThreadLocal.ThreadLocalMap中table的某一位置set一個值的工具而已2、同步與ThreadLocal是解決多線程中數據訪問問題的兩種思路,前者是數據共享的思路,后者是數據隔離的思路

3、同步是一種以時間換空間的思想,ThreadLocal是一種空間換時間的思想

4、ThreadLocal和request區別:

(1)ThreadLocal只能存一個值,一個Request由於是Map形式的,可以用key-value形式存多個值

(2)ThreadLocal一般用在框架,Request一般用在表示層、Action、Servlet

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM