更新時間:2022-03-17 10:53:34 來源:動力節(jié)點 瀏覽1198次
我們來看一下JavaWeb多線程ThreadLocal的簡單使用,首先ThreadLocal肯定是全局共享的:
public class Tools
{
public static ThreadLocal<String> t1 = new ThreadLocal<String>();
}
寫一個線程往ThreadLocal里面塞值:
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();
}
}
}
寫個main函數(shù),啟動三個ThreadLocalThread:
public static void main(String[] args) throws Exception
{
ThreadLocalThread a = new ThreadLocalThread("ThreadA");
ThreadLocalThread b = new ThreadLocalThread("ThreadB");
ThreadLocalThread c = new ThreadLocalThread("ThreadC");
a.start();
b.start();
c.start();
}
看一下運行結果:
ThreadA get value--->1
ThreadC get value--->2
ThreadB get value--->3
ThreadB get value--->4
ThreadC get value--->6
ThreadA get value--->5
ThreadC get value--->8
ThreadA get value--->7
ThreadB get value--->9
看到每個線程的里都有自己的String,并且互不影響----因為絕對不可能出現(xiàn)數(shù)字重復的情況。用一個ThreadLocal也可以多次set一個數(shù)據(jù),set僅僅表示的是線程的ThreadLocal.ThreadLocalMap中table的某一位置的value被覆蓋成你最新設置的那個數(shù)據(jù)而已,對于同一個ThreadLocal對象而言,set后,table中絕不會多出一個數(shù)據(jù),這里要注意,如果第一次沒有給ThreadLocal設置值的話,是會返回null的。