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();
}
}
}
|
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