在我們想要談論Java並發包(java.util.concurrent)的時候,這是一個頭疼的問題,卻又是每個Java工程師不得不掌握的一項技能。一直以來都想寫一個Java並發包系列,無奈遲遲沒有動手動腦。最近重新思考規划了自己的學習路線,決定從Java並發包開始把每個技術、原理、源碼做成一個一個系列,由淺入深,由表及里。
這是Java並發包的開篇,我將大致介紹從一個較為宏觀的角度來窺探Java並發包,以及這個系列的一些大致思路。
java.util.concurrent從jdk1.5開始新加入的一個包,致力於解決並發編程的線程安全問題,使用戶更夠更為快捷方便的編寫多線程情況下的並發程序。談到線程安全問題總會免不了幾個核心問題:鎖、阻塞、原子性、可見性等等。
-java.util.concurrent -atomic -locks …
在concurrent包下還有兩個子包,一個是atomic這里面放置的是一些原子類,比如在多線程環境下執行i++的操作實際上是i+1再是將結果賦值給i,這里就會涉及到一個線程安全問題,當一個線程正在執行i+1的時候,很有可能另外一個線程正在讀取i的值,這個時候就會造成數據不一致,這是原子性問題。即時一個線程完成了i++的操作,而另外一個線程此時來讀取i的值也有可能發現i並不是想加后的值,這是可見性問題。atomic里的AtomInteger就能完美解決原子性和可見性問題。
另一個包是locks,這里面的包可以說是提供了並發包里線程安全的最為基礎的工具——顯示鎖(ReentrantLock、ReadWriteLock)。Java中有synchronized修飾的同步代碼塊內置鎖,但這遠遠不能滿足一些高級特性,例如通過輪詢、定時的方式去獲得一個鎖,並發包中的顯示鎖的靈活性要高於synchronized,但隨之而來的是使用的難度會增加,使用不當則會造成未知的后果。
concurrent包下就是一些並發工具類,常見的有ConcurrentHashMap、ArrayLinkedQueue、LinkedLinkedQueue……這些都是線程安全的類,根據情況不同選取不同的類。
在這個系列的是開始我會首先介紹有關線程的一些基礎知識以及專業術語,例如:線程與進程、阻塞與非阻塞、線程安全、原子性、可見性等等,有時候可能會“超綱”,超綱部分做簡要闡述。接着會從實例出發分門別類的介紹並發包以及源碼,源碼以jdk1.7為主,有時可能會設計最新的jdk1.8甚至是jdk1.6,這會特殊標明。最后會對Java並發包做一個總結性的概述。
以上就是Java並發包系列的開篇。如有錯誤,請留下評論批評指正。