ThreadLocal

先來看看ThreadLocal的注釋:
This class provides** thread-local variables**. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable. ThreadLocalinstances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID).

翻譯過來就是:ThreadLocal提供了線程級的變量,這個(gè)變量和其他的使用set、get訪問的變量不一樣,ThreadLocal針對每個(gè)線程會為該變量維護(hù)經(jīng)過單獨(dú)初始化的副本。ThreadLocal實(shí)例希望定義為private static。

從注釋可以看出ThreadLocal解決的問題是:

  • 單線程的變量共享

單線程變量共享

如果是變量共享為什么不用一個(gè)全局變量就好呢?主要是因?yàn)門hreadLocal為每個(gè)線程維護(hù)經(jīng)過單獨(dú)初始化的變量副本,但是普通的變量訪問到的就是同一個(gè)。

上面的注釋也說了,ThreadLocal會為每個(gè)線程維護(hù)經(jīng)過單獨(dú)初始化的變量副本,每個(gè)線程訪問的都是自己的副本,所以各個(gè)線程之間不會相互影響,達(dá)到隔離的作用

線程同步解決的是多線程訪問共享資源的問題,但是ThreadLocal本身并不是用來多線程之間共享的,只是用來單線程共享的,所以ThreadLocal和線程同步根本不是一回事兒

實(shí)現(xiàn)原理

  • 每個(gè)Thread都有一個(gè)ThreadLocal.ThreadLocalMap,因?yàn)門hread類里面有一個(gè)該類的對象,用來存放該線程中所有的ThreadLocal類型的變量

  • ThreadLocalMap里面有一個(gè)Entry(繼承自WeakReference,一個(gè)對象保存一個(gè)鍵值對)數(shù)組,根據(jù)key(這里就是ThreadLocal變量本身)的哈希值將value(這里就是需要保存的數(shù)據(jù))

    網(wǎng)友評論