1 threadLocal:存值時再以當前 ThreadLocal 實例對象為 key杈女,這樣即使同一線程中榜揖,不同 ThreadLocal 雖然使用同一個容器,但 key 不一樣,取值時也就不會相互影響务甥。key使用WeakReference 存儲牡辽,在get 或者set 的時候如果key==null的時候,就可以認為這個值無效了敞临,就會去清理态辛。
泄露的場景僅且僅在:
線程run方法結束后沒有顯示的調用remove進行清理
線程在線程池的模式下,一直重復運行挺尿。
2.volatile只能讓被他修飾內容具有可見性奏黑,但不能保證它具有原子性。比如 volatile int a = 0编矾;之后有一個操作 a++熟史;這個變量a具有可見性,但是a++ 依然是一個非原子操作窄俏,也就這這個操作同樣存在線程安全問題蹂匹。
原子操作的三個原則::原子性,有序性和可見性
synchronized: 具有原子性裆操,有序性和可見性怒详;
synchronized的三種使用方式
修飾實例方法,為當前實例加鎖踪区,進入同步方法前要獲得當前實例的鎖昆烁。
修飾靜態(tài)方法,為當前類對象加鎖缎岗,進入同步方法前要獲得當前類對象的鎖静尼。
修飾代碼塊,指定加鎖對象传泊,對給定對象加鎖鼠渺,進入同步代碼塊前要獲得給定對象的鎖。
synchronized的等待喚醒是通過notify/notifyAll和wait
synchronized的底層實現(xiàn)主要依靠Lock-Free的隊列眷细,基本思路是自旋后阻塞拦盹,競爭切換后繼續(xù)競爭鎖,稍微犧牲了公平性溪椎,但獲得了高吞吐量
volatile:具有有序性和可見性
synchronized這種獨占鎖屬于悲觀鎖,樂觀鎖最常見的就是CAS(當多個線程同時對某個資源進行CAS操作普舆,只能有一個線程操作成功,但是并不會阻塞其他線程,其他線程只會收到操作失敗的信號校读≌勇拢可見 CAS 其實是一個樂觀鎖):
我們假設內存中的原數(shù)據(jù)V,舊的預期值A歉秫,需要修改的新值B蛾洛。
比較 A 與 V 是否相等。(比較)
如果比較相等雁芙,將 B 寫入 V轧膘。(交換)
返回操作是否成功钞螟。