Java併發編程:深入剖析ThreadLocal
ThreadLocal類可以理解為ThreadLocalVariable(線程局部變量),提供了get與set等訪問接口或方法,這些方法為每個使用該變量的線程都存有一份獨立的副本,因此get總是返回當前執行線程在調用set時設置的最新值。可以將ThreadLocal
概括起來説,對於多線程資源共享的問題,同步機制採用了“以時間換空間”的方式,而ThreadLocal採用了“以空間換時間”的方式。前者僅提供一份變量,讓不同的'線程排隊訪問,而後者為每一個線程都提供了一份變量,因此可以同時訪問而互不影響。
模擬ThreadLocal
複製代碼 代碼如下:
import ections;
import Map;
import ;
public class SimpleThreadLocal
private Map
hronizedMap(new HashMap
public void set(T newValue) {
(entThread(), newValue); // ①鍵為線程對象,值為本線程的變量副本
}
public T get() {
Thread currentThread = entThread();
T o = (currentThread); // ②返回本線程對應的變量
if (o == null && !ainsKey(currentThread)) { // ③如果在Map中不存在,放到Map中保存起來。
o = initialValue();
(currentThread, o);
}
return o;
}
public void remove() {
ve(entThread());
}
protected T initialValue() {
return null;
}
}
實用ThreadLocal
複製代碼 代碼如下:
class Count {
private SimpleThreadLocal
@Override
protected Integer initialValue() {
return 0;
}
};
public Integer increase() {
(() + 1);
return ();
}
}
class TestThread implements Runnable {
private Count count;
public TestThread(Count count) {
t = count;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 1; i <= 3; i++) {
tln(entThread()ame() + "t" + i
+ "tht" + ease());
}
}
}
public class TestThreadLocal {
public static void main(String[] args) {
Count count = new Count();
Thread t1 = new Thread(new TestThread(count));
Thread t2 = new Thread(new TestThread(count));
Thread t3 = new Thread(new TestThread(count));
Thread t4 = new Thread(new TestThread(count));
t();
t();
t();
t();
}
}
輸出
複製代碼 代碼如下:
Thread-0 1th 1
Thread-0 2th 2
Thread-0 3th 3
Thread-3 1th 1
Thread-1 1th 1
Thread-1 2th 2
Thread-2 1th 1
Thread-1 3th 3
Thread-3 2th 2
Thread-3 3th 3
Thread-2 2th 2
Thread-2 3th 3
-
關於Java程序員面試中的多線程問題總結
很多核心Java面試題來源於多線程(Multi-Threading)和集合框架(CollectionsFramework),理解核心線程概念時,嫻熟的實際經驗是必需的。這篇文章收集了Java線程方面一些典型的問題,這些問題經常被高級工程師所問到。0、Java中多線程同步是什麼?在多線程程序下,同步能控...
-
java環境變量設置path
導語:java的環境變量是怎麼設置的呢?以下小編為大家介紹java環境變量設置path文章,僅供參考!java環境變量設置path環境變量是一個具有特定名字的對象,它包含了一個或者多個應用程序所將使用到的信息。例如path,當要求系統運行一個程序而沒有告訴它程序所在的完整路...
-
Java開發崗位面試題
為幫助參加Java開發崗位面試的朋友們做好準備,以下是本站小編搜索整理的一份Java集合面試問題40個【附答案】,供參考練習,希望對大家有所幫助!想了解更多相關信息請持續關注我們應屆畢業生考試網!一、Java基礎1、String類為什麼是final的。2、HashMap的源碼,實現原...
-
Java運算符
計算機的最基本用途之一就是執行數學運算,作為一門計算機語言,Java也提供了一套豐富的運算符來操縱變量。歡迎大家閲讀!更多相關信息請關注相關欄目!Java中的運算符和C/C++相差無幾。數學運算符數學運算,結果為一個數值。見下表:關係運算符關係運算符,結果為一個布爾...
相關文章
- 簡單地分析Java線程編程中ThreadLocal類的使用
- 如何理解Javascript的caller,callee,call,apply區別
- 如何理解Javascript的caller,callee,call,apply區別
- A Lifeguard at Johns Beach Saved a Drowning Child,A Lifeguar英語作文
- 如何理解Javascript的caller,callee,call,apply區別
- Java ClassLoader原理深入講解
- 如何理解Javascript的caller,callee,call,apply區別
- 如何理解Javascript的caller,callee,call,apply區別
- 如何理解Javascript的caller,callee,call,apply區別
- 如何理解Javascript的caller,callee,call,apply區別