多執行緒 執行緒內區域性變數

2021-10-01 08:24:34 字數 1896 閱讀 5793

該類提供了執行緒內區域性 (thread-local) 變數。

好比有兩個視窗(兩個執行緒),乙個視窗可以拿飲料,乙個視窗可以拿食物。現在有多個人要來拿東西,如果在飲料視窗有的人拿到了飲料,有的人拿到了不該拿的食物,就說明執行緒之間出現了混亂,我們應當避免這種情況出現。

以下**就可能會出現執行緒混亂的問題:

private static int data;

public static void main(string args)

}).start();

}}//模組a

static class a

}//模組b

static class b

}

隨機的列印結果如下:

thread-0上的資料是:-312244177

thread-1上的資料是:-1541655481

thread-0上a模組取得資料:-312244177

thread-1上a模組取得資料:-312244177

thread-0上b模組取得資料:-312244177

thread-1上b模組取得資料:-312244177 

//建立threadlocal物件,泛型為要儲存的資料的型別

private static threadlocallocal = new threadlocal();

public static void main(string args)

}).start();

}}//模組a

static class a

}//模組b

static class b

}

在 set 方法執行時,會首先根據當前執行緒獲取當前執行緒的threadlocalmap物件,然後往這個map中插入一條記錄:key 其實是threadlocal物件,用於記錄當前執行緒唯一的區域性識別符號(在第一次自動呼叫 uniquethreadidgenerator.getcurrentthreadid()時分配的,在後續呼叫中不會更改。),value是各自的set方法傳進去的值。這樣就記錄了執行緒和當前執行緒中資料的對映繫結關係。

乙個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 該函式內部就有乙個靜態指標,如果多個執行緒同時呼叫此函式...