該類提供了執行緒內區域性 (thread-local) 變數。
好比有兩個視窗(兩個執行緒),乙個視窗可以拿飲料,乙個視窗可以拿食物。現在有多個人要來拿東西,如果在飲料視窗有的人拿到了飲料,有的人拿到了不該拿的食物,就說明執行緒之間出現了混亂,我們應當避免這種情況出現。
以下**就可能會出現執行緒混亂的問題:
private static int data;
public static void main(string args)
}).start();
}}//模組a
static class a
}//模組b
static class b
}
隨機的列印結果如下:
thread-0上的資料是:-312244177thread-1上的資料是:-1541655481
thread-0上a模組取得資料:-312244177
thread-1上a模組取得資料:-312244177
thread-0上b模組取得資料:-312244177
thread-1上b模組取得資料:-312244177
在 set 方法執行時,會首先根據當前執行緒獲取當前執行緒的threadlocalmap物件,然後往這個map中插入一條記錄:key 其實是threadlocal物件,用於記錄當前執行緒唯一的區域性識別符號(在第一次自動呼叫 uniquethreadidgenerator.getcurrentthreadid()時分配的,在後續呼叫中不會更改。),value是各自的set方法傳進去的值。這樣就記錄了執行緒和當前執行緒中資料的對映繫結關係。//建立threadlocal物件,泛型為要儲存的資料的型別
private static threadlocallocal = new threadlocal();
public static void main(string args)
}).start();
}}//模組a
static class a
}//模組b
static class b
}
乙個threadlocal物件可以多個執行緒共用。可以直接看做是乙個map容器,用來儲存當前執行緒和對應值的鍵值對。因為鍵的唯一性,所以乙個threadlocal物件在乙個執行緒內只能儲存乙個資料;如果要在乙個執行緒內儲存多條資料,就需要建立多個threadlocal物件來訪問資料,比較麻煩。
可以將乙個執行緒內的多個資料封裝成乙個實體類,然後使用set方法存入乙個實體類物件,再取出乙個實體類物件。通常使用單例模式來設計該實體類物件,並將實體類和threadlocal物件進行繫結。
我們可以將threadlocal隱藏起來,使其對外部而言只用關注資料即可。優雅的設計如下:
public class threadlocalmap2
}).start();
}//模組a
static class a
}//模組b
static class b
}//儲存資料的實體類
static class user
public synchronized static user getuser()
return user;
}public string getname()
public void setname(string name)
public integer getage()
public void setage(integer age) }}
ThreadLocal執行緒區域性變數 多執行緒與高併發
threadlocal執行緒區域性變數,實現了將物件變數儲存在特定的執行緒物件中,僅對當前執行緒可見。我們在測試程式中,乙個執行緒往threadlocal物件中放置物件,然後另乙個物件來取物件取不到。public class testthreadlocal catch interruptedexce...
多執行緒 多執行緒共享區域性變數的方法
1.操作相同時,寫乙個 runnable 實現類,內部設定成員變數,run 方法修改該變數,將該runnable傳給不同thread使用 2.操作不同時,在thread呼叫類例項化乙個資料例項,傳遞給不同runnable處理,再把不同的runnable傳給不同thread使用 3.在thread呼叫...
多執行緒開發時執行緒區域性變數的使用
一 概述 現在多核時代多執行緒開發越來越重要了,多執行緒相比於多程序有諸多優勢 當然也有諸多劣勢 在早期c的庫中,有許多函式是執行緒不安全的,因為內部用到了靜態變數,比如 char strtok char s,const char delim 該函式內部就有乙個靜態指標,如果多個執行緒同時呼叫此函式...