1. 程式人生 > >20170906-多線程之ThreadLocal

20170906-多線程之ThreadLocal

ron () 介紹 不同的 www 線程共享數據 參考文獻 很多 分配

之前看了幾篇ThreadLocal 的介紹 說了很多讓人誤解的東西 比如 ThreadLocal 是解決多線程共享數據的問題。。等等

參考文獻:http://www.iteye.com/topic/103804 說的挺接地氣

1.首先,ThreadLocal 不是用來解決共享對象的多線程訪問問題的,一般情況下,通過ThreadLocal.set() 到線程中的對象是該線程自己使用的對象,其他線程是不需要訪問的,也訪問不到的。各個線程中訪問的是不同的對象另外,說ThreadLocal使得各線程能夠保持各自獨立的一個對象,並不是通過ThreadLocal.set()來實現的,而是通過每個線程中的new 對象 的操作來創建的對象,每個線程創建一個,不是什麽對象的拷貝或副本。

通過ThreadLocal.set()將這個新創建的對象的引用保存到各線程的自己的一個map中,每個線程都有這樣一個map,執行ThreadLocal.get()時,各線程從自己的map中取出放進去的對象,因此取出來的是各自自己線程中的對象,ThreadLocal實例是作為map的key來使用的。

2.技術分享

而作為ThreadLocal實例的變量只有 threadLocalHashCode 這一個,nextHashCode 和HASH_INCREMENT 是ThreadLocal類的靜態變量,實際上HASH_INCREMENT是一個常量,表示了連續分配的兩個ThreadLocal實例的threadLocalHashCode值的增量,而nextHashCode 的表示了即將分配的下一個ThreadLocal實例的threadLocalHashCode 的值。

每個ThreadLocal當然只能放一個對象。要是需要放其他的對象,就再new 一個新的ThreadLocal出來,這個新的ThreadLocal作為key,需要放的對象作為value,放在ThreadLocalMap中。。。。

就是ThreadLocal.set() 裏把ThreadLocal的實例作為KEY 對象作為value 每個ThreadLocal實例後邊只存一個對象 上邊三個常量就是每次實例不同的標識

20170906-多線程之ThreadLocal