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提供了線程級的變量,這個變量和其他的使用set、get訪問的變量不一樣,ThreadLocal針對每個線程會為該變量維護經(jīng)過單獨初始化的副本。ThreadLocal實例希望定義為private static。
從注釋可以看出ThreadLocal解決的問題是:
- 單線程的變量共享
單線程變量共享
如果是變量共享為什么不用一個全局變量就好呢?主要是因為ThreadLocal為每個線程維護經(jīng)過單獨初始化的變量副本,但是普通的變量訪問到的就是同一個。
上面的注釋也說了,ThreadLocal會為每個線程維護經(jīng)過單獨初始化的變量副本,每個線程訪問的都是自己的副本,所以各個線程之間不會相互影響,達到隔離的作用
線程同步解決的是多線程訪問共享資源的問題,但是ThreadLocal本身并不是用來多線程之間共享的,只是用來單線程共享的,所以ThreadLocal和線程同步根本不是一回事兒
實現(xiàn)原理
-
每個Thread都有一個ThreadLocal.ThreadLocalMap,因為Thread類里面有一個該類的對象,用來存放該線程中所有的ThreadLocal類型的變量
-
ThreadLocalMap里面有一個Entry(繼承自WeakReference,一個對象保存一個鍵值對)數(shù)組,根據(jù)key(這里就是ThreadLocal變量本身)的哈希值將value(這里就是需要保存的數(shù)據(jù))