Java併發編程技術點


一、synchronized原理

1. JVM規範規定JVM基於monitorenter和monitorexit指令實現,這兩個成對出現。任何對象都有一個monitor與之關聯。同步代碼塊在編譯後,monitorenter會出現在塊開始位置,noitorexit會插入結束位置。其實可以粗略理解爲每個對象在JVM都是唯一的,每個對象在併發時都要先看與之關聯的標誌位,如果被鎖則不能進入。

2. 鎖存在Java對象頭裏。


二、ThreadLocal

作用:ThreadLocal在每個線程中對該變量會創建一個副本,即每個線程內部都會有一個該變量,且在線程內部任何地方都可以使用,線程之間互不影響,這樣一來就不存在線程安全問題,也不會嚴重影響程序執行性能。ThreadLocal 不是用來解決共享對象的多線程訪問問題的,一般情況下,通過ThreadLocal.set() 到線程中的對象是該線程自己使用的對象,其他線程是不需要訪問的,也訪問不到的。

使用場景:解決數據庫連接、Session管理等。如Connection,做成線程安全的會導致併發控制,影響性能。如果每個線程自己建個連接又太影響數據庫服務器的性能。故用ThreadLocal最合適了。每個線程創建一個副本。待查其它用ThreadLocal的場景。一般ThreadLocal是放在一個對象裏,多個線程共用這個對象。http://blog.csdn.net/lufeng20/article/details/24314381有例子。

實現原理及源碼解讀:http://www.cnblogs.com/dolphin0520/p/3920407.html

自我總結:ThreadLocal是通過ThreadLocalMap類實現的,鍵是ThreadLocal對象本身,值是保存變量的值,ThreadLocalMap放在線程裏。其中ThreadLocalMap中的Entry是繼承弱引用的,當ThreadLocal對象沒了時,線程中也不會保存ThreadLocalMap中的這一項。如果不做成弱引用,當ThreadLocal對象被回收時,發現還有引用,會造成內存泄露。


三、concurrentHashMap

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章