執行緒封閉有三種方式:ad-hoc執行緒封閉、棧封閉、threadlocal類;其中ad-hoc執行緒封閉一般由程式設計師自己實現,很少用,暫不介紹。
將物件封閉在區域性變數中,只有區域性變數才能訪問,保證執行緒安全。下面我們來看一段簡單的**
public
class
animals
}return numpairs;
}class
animal
}enum species
enum gender
class
animalpair
}class
speciesgendercomparator
implements
comparator }
class
ark }}
animals被封裝在乙個區域性變數treeset中,並將指向該物件的乙個引用儲存到animals,此時只有乙個引用指向animals,這個引用被封閉在區域性變數中,從而實現執行緒封閉。
每個執行緒獨有,避免變數共享;為每個執行緒建立乙個副本;
定義了乙個靜態內部類threadlocalmap,key存的是threadlocal例項本身,value存的是副本變數;這樣就達到了每個執行緒有單獨的副本變數,實現了變數隔離。threadlocalmap採用了雜湊表,不同於hashmap,主要不同之處在於hash衝突解決方案,hashmap當衝突時採用的是分離鍊錶法,就是採用鍊錶來儲存衝突的value;而threadlocalmap採用的是開放定址法,當衝突時會再次做hash運算,知道找到空餘的陣列,這樣做事因為threadlocalmap很少有hash衝突;
分離鍊錶法:
開放定址法
java併發之執行緒封閉
實現好的併發是一件困難的事情,所以很多時候我們都想躲避併發。避免併發最簡單的方法就是執行緒封閉。什麼是執行緒封閉呢?就是把物件封裝到乙個執行緒裡,只有這乙個執行緒能看到此物件。那麼這個物件就算不是執行緒安全的也不會出現任何安全問題。實現執行緒封閉有哪些方法呢?這是完全靠實現者控制的執行緒封閉,他的執...
(三)Java併發學習筆記 執行緒封閉
實現好的併發是一件困難的事情,所以很多時候我們都想躲避併發。避免併發最簡單的方法就是執行緒封閉。什麼是執行緒封閉呢?就是把物件封裝到乙個執行緒裡,只有這乙個執行緒能看到此物件。那麼這個物件就算不是執行緒安全的也不會出現任何安全問題。實現執行緒封閉有哪些方法呢?這是完全靠實現者控制的執行緒封閉,他的執...
java執行緒封閉
package com.ly.study.base 執行緒封閉示例 public class threadlocaltestclass start thread.sleep 5000l 等待所有執行緒執行結束 v value.get system.out.println 執行緒1執行之後,主線程取到...