ThreadLocal這麼回事

2021-09-01 13:56:28 字數 1441 閱讀 7018

今天執行緒池實現,看到乙個使用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 敏捷已經成為一種炙手可熱的新時...