搜尋

首頁  >  問答  >  主體

java - 为什么ThreadLocal 选择在线程中使用成员变量,而不是维护一个以线程为Key,值为value的集合?

阿神阿神2766 天前450

全部回覆(4)我來回復

  • 大家讲道理

    大家讲道理2017-04-18 10:39:44

    按照設計來說,ThreadLocal应该依附于Thread的存在而存在,每一个线程都可以有一份空间来存储,所以你说的第2点我非常赞同,至于第1点,我不太看得懂。
    如果按照你的设计,将map放在ThreadLocal,那么这个map得是static的(或者ThreadLocal单例中的成员变量),这样在设计上存在严重问题,这个map將非常難以管理:

    1. 试想有没有线程安全问题?
    2. 线程销毁后怎么处理,不做处理这个map将会越来越大?
    

    設計都有一套方法,甚至有關哲學,得細細品味。

    回覆
    0
  • 黄舟

    黄舟2017-04-18 10:39:44

    至少我能想到的一點就是:

    減少互斥的代價

    有一個場景: 為了提升DateFormat的效能, 一般會結合ThreadLocal.

    回覆
    0
  • 怪我咯

    怪我咯2017-04-18 10:39:44

    有些設計有時候並不是單純為了效能,要知道Java是最注重設計模式的,而單一職責是設計模式最重要的原則之一。
    反過來說,在ThreadLocal裡直接實現一套Map豈不是比直接使用Map更快速度嗎,但顯然這麼做有違單一職責,也使得維護的成本更高。

    回覆
    0
  • 迷茫

    迷茫2017-04-18 10:39:44

    如果ThreadLoad直接使用Map為底層資料結構,當有大量的執行緒使用ThreadLocal時,首先Map存取的效能會下降,伴隨著執行緒生命週期,底層的Map還需要頻繁的新增刪除entity,這就很容易造成效能瓶頸。

    回覆
    0
  • 取消回覆