首先,ThreadLocal 不是用來解決共享物件的多執行緒訪問問題的,一般情況下,透過ThreadLocal.set() 到執行緒中的物件是該執行緒自己使用的物件,其他執行緒是不需要訪問的,也訪問不到的。各個執行緒中訪問的是不同的物件。
另外,說ThreadLocal使得各執行緒能夠保持各自獨立的一個物件,並不是透過ThreadLocal.set()來實現的,而是透過每個執行緒中的new 物件 的操作來建立的物件,每個執行緒建立一個,不是什麼物件的複製或副本。透過ThreadLocal.set()將這個新建立的物件的引用儲存到各執行緒的自己的一個map中,每個執行緒都有這樣一個map,執行ThreadLocal.get()時,各執行緒從自己的map中取出放進去的物件,因此取出來的是各自自己執行緒中的物件,ThreadLocal例項是作為map的key來使用的。
如果ThreadLocal.set()進去的東西本來就是多個執行緒共享的同一個物件,那麼多個執行緒的ThreadLocal.get()取得的還是這個共享物件本身,還是有併發訪問問題。
之前對於執行緒和方法的理解有些偏差,竟稀裡糊塗的認為一個執行緒就是一個方法,一個方法就是一個執行緒。尤其在理解ThreadLocal執行原理的時候,更是暈乎
(ThreadLocal把當前執行緒作為key,來維護管理一個可變的物件,在某一個方法裡面set值,在後面的某個方法呼叫裡面get值,如果一個方法就是一個執行緒,那set和get使用的key就不是同一個了,set進去的值get是拿不出來了)
現在可以肯定,一個執行緒由一個方法啟動,一個執行緒裡面可以有多個方法,並不是每個方法都是一個執行緒。
首先,ThreadLocal 不是用來解決共享物件的多執行緒訪問問題的,一般情況下,透過ThreadLocal.set() 到執行緒中的物件是該執行緒自己使用的物件,其他執行緒是不需要訪問的,也訪問不到的。各個執行緒中訪問的是不同的物件。
另外,說ThreadLocal使得各執行緒能夠保持各自獨立的一個物件,並不是透過ThreadLocal.set()來實現的,而是透過每個執行緒中的new 物件 的操作來建立的物件,每個執行緒建立一個,不是什麼物件的複製或副本。透過ThreadLocal.set()將這個新建立的物件的引用儲存到各執行緒的自己的一個map中,每個執行緒都有這樣一個map,執行ThreadLocal.get()時,各執行緒從自己的map中取出放進去的物件,因此取出來的是各自自己執行緒中的物件,ThreadLocal例項是作為map的key來使用的。
如果ThreadLocal.set()進去的東西本來就是多個執行緒共享的同一個物件,那麼多個執行緒的ThreadLocal.get()取得的還是這個共享物件本身,還是有併發訪問問題。
之前對於執行緒和方法的理解有些偏差,竟稀裡糊塗的認為一個執行緒就是一個方法,一個方法就是一個執行緒。尤其在理解ThreadLocal執行原理的時候,更是暈乎
(ThreadLocal把當前執行緒作為key,來維護管理一個可變的物件,在某一個方法裡面set值,在後面的某個方法呼叫裡面get值,如果一個方法就是一個執行緒,那set和get使用的key就不是同一個了,set進去的值get是拿不出來了)
現在可以肯定,一個執行緒由一個方法啟動,一個執行緒裡面可以有多個方法,並不是每個方法都是一個執行緒。