轉自:
http://www.java265.com/JavaCourse/202205/3370.html
下文筆者講述java中ThreadLocal的詳解說明,如下所示:
ThreadLocal簡介
ThreadLocal的功能:
用于創建執行緒區域變數的類
----------------------------------------------------------------------------
我們都知道我們創建的變數,可以被任何一個執行緒訪問和修改
但是當我們使用ThreadLocal創建的變數只能被當前執行緒訪問,其他執行緒無法訪問和修改
-----------------------------------------------------------------------------
ThreaLocal用法示例
ThreadLocal定義:
ThreadLocal<String> threadLocalInfo = new ThreadLocal<>();
set方法
threadLocalInfo.set("java265.com");
get方法
threadLocalInfo.get();
完整的示例
private void testThreadLocal() {
Thread t = new Thread() {
ThreadLocal<String> threadLocalInfo = new ThreadLocal<>();
@Override
public void run() {
super.run();
threadLocalInfo.set("java265.com--我最愛的網站");
threadLocalInfo.get();
}
};
t.start();
}
ThreadLocal初始值--設定方法
ThreadLocal設定默認的get初始值
需要重寫initialValue方法
例:
ThreadLocal<String> mThreadLocal = new ThreadLocal<String>() {
@Override
protected String initialValue() {
return Thread.currentThread().getName();
}
};
ThreadLocal的set方法原理說明
set方法原始碼:
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
getMap:
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
class Thread implements Runnable {
ThreadLocal.ThreadLocalMap threadLocals = null;
}
當一開始設定,即ThreadLocalMap物件未創建
則新建ThreadLocalMap物件,并設定初始值
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
ThreadLocal導致記憶體泄露的原因說明
ThreadLocal實體被執行緒的ThreadLocalMap實體持有,也可以看成被執行緒持有, 當我們使用了執行緒池,由于之前的執行緒實體處理完之后出于復用的目的依然存活 即ThreadLocal設定的值被持有,才會導致記憶體泄露 ThreadLocal并不會產生記憶體泄露 因為ThreadLocalMap在選擇key的時候 并不是直接選擇ThreadLocal實體 而是ThreadLocal實體的弱參考,
static class ThreadLocalMap {
/**
* The entries in this hash map extend WeakReference, using
* its main ref field as the key (which is always a
* ThreadLocal object). Note that null keys (i.e. entry.get()
* == null) mean that the key is no longer referenced, so the
* entry can be expunged from table. Such entries are referred to
* as "stale entries" in the code that follows.
*/
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = https://www.cnblogs.com/java265/archive/2022/07/14/v;
}
}
}
ThreadLocal使用場景
如:tractional
一個資料庫連接,在一個執行緒中只此一份,所以可使用ThreadLocal實作執行緒間變數共享
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/499326.html
標籤:其他
上一篇:Array原始碼刨析
