闭关修行中......
按照設計來說,ThreadLocal应该依附于Thread的存在而存在,每一个线程都可以有一份空间来存储,所以你说的第2点我非常赞同,至于第1点,我不太看得懂。如果按照你的设计,将map放在ThreadLocal,那么这个map得是static的(或者ThreadLocal单例中的成员变量),这样在设计上存在严重问题,这个map將非常難以管理:
ThreadLocal
Thread
map
static
1. 试想有没有线程安全问题? 2. 线程销毁后怎么处理,不做处理这个map将会越来越大?
設計都有一套方法,甚至有關哲學,得細細品味。
至少我能想到的一點就是:
減少互斥的代價
有一個場景: 為了提升DateFormat的效能, 一般會結合ThreadLocal.
有些設計有時候並不是單純為了效能,要知道Java是最注重設計模式的,而單一職責是設計模式最重要的原則之一。 反過來說,在ThreadLocal裡直接實現一套Map豈不是比直接使用Map更快速度嗎,但顯然這麼做有違單一職責,也使得維護的成本更高。
如果ThreadLoad直接使用Map為底層資料結構,當有大量的執行緒使用ThreadLocal時,首先Map存取的效能會下降,伴隨著執行緒生命週期,底層的Map還需要頻繁的新增刪除entity,這就很容易造成效能瓶頸。
按照設計來說,
ThreadLocal
应该依附于Thread
的存在而存在,每一个线程都可以有一份空间来存储,所以你说的第2点我非常赞同,至于第1点,我不太看得懂。如果按照你的设计,将
map
放在ThreadLocal
,那么这个map
得是static
的(或者ThreadLocal
单例中的成员变量),这样在设计上存在严重问题,这个map
將非常難以管理:設計都有一套方法,甚至有關哲學,得細細品味。
至少我能想到的一點就是:
有一個場景: 為了提升DateFormat的效能, 一般會結合ThreadLocal.
有些設計有時候並不是單純為了效能,要知道Java是最注重設計模式的,而單一職責是設計模式最重要的原則之一。
反過來說,在ThreadLocal裡直接實現一套Map豈不是比直接使用Map更快速度嗎,但顯然這麼做有違單一職責,也使得維護的成本更高。
如果ThreadLoad直接使用Map為底層資料結構,當有大量的執行緒使用ThreadLocal時,首先Map存取的效能會下降,伴隨著執行緒生命週期,底層的Map還需要頻繁的新增刪除entity,這就很容易造成效能瓶頸。