今天執行緒池實現,看到乙個使用threadlocal的地方,研究了一下threadlocal這東西,發現很有意思。
從原始碼研究看threadlocal的實現原理吧
package com.sogou.game.cms.pool;
import org.apache.thrift.transport.tsocket;
public class connectionmanager
/*** 取socket
* @return tsocket
*/ public tsocket getsocket() catch (exception e) finally
return socket;
} public connectionprovider getconnectionprovider()
public void setconnectionprovider(connectionprovider connectionprovider)
}
這段**裡面使用了threadlocal,threadlocal在使用時一般會宣告為static變數,後面分析原始碼時候會說到為什麼是static。
threadlocal
看一下threadlocal的get方法
public t get()
return setinitialvalue();
}
獲取當前執行緒,然後將當前執行緒傳入getmap()得到threadlocalmap
下面是threadlocalmap的實現方式,可以簡單認為是乙個map,key為threadlocal值,value為要set的值;
static class threadlocalmap
}}
繼續getmap方法
threadlocalmap getmap(thread t)
返回thread t的threadlocals的值,那threadlocals為何物呢?
threadlocal.threadlocalmap threadlocals = null;
轉了一圈怎麼又回來了
理一下思路
static threadlocal 在set的時候是set到thread自有的threadlocalmap中,key為threadlocal變數
threadlocal的作用就了然了
在多執行緒,假設threada、threadb,static的threadlocal是相同的,當threada執行set方法是,是將相應的key、value set自己獨有的threadlocalmap中,get方法的原理也同樣。由於key不變,所以保證多執行緒在get、set時取到自身在set、get時值,這也是為什麼threadlocal一般是static了。
設計模式,就這麼回事 模板模式
需求 定義n多個人的生活方式 分析 每個人的生活都差不多,應該會用到模板吧。初步實現如下 class 人 小明 人 小明.吃飯 小明.睡覺 小明.工作 小明.娛樂 小紅 人 小紅.吃飯 小紅.睡覺 小紅.工作 小紅.娛樂 這樣的確是一種很好的方式。這算不算模板呢?算,原來繼承本身就是一種模板。改進 ...
原來AGILE就是這麼一回事啊!
僅僅還在幾年前,xp 還被認為是方法異教,fdd 屬於黑客程式方法。如今,敏捷儼然已經成為主流學說,敏捷方法成為人們學習和討論的熱點。敏捷方法的應用也更加廣泛,以至於不少外包專案都要求採用某種敏捷方法。它不僅僅是小團隊和小專案在使用,甚至連微軟都開始使用 scrum 敏捷已經成為一種炙手可熱的新時尚...
原來AGILE就是這麼一回事啊!
僅僅還在幾年前,xp 還被認為是方法異教,fdd 屬於黑客程式方法。如今,敏捷儼然已經成為主流學說,敏捷方法成為人們學習和討論的熱點。敏捷方法的應用也更加廣泛,以至於不少外包專案都要求採用某種敏 捷方法。它不僅僅是小團隊和小專案在使用,甚至連微軟都開始使用 scrum 敏捷已經成為一種炙手可熱的新時...