在JDK1.5之前,Java中擁有的與線程和同步相關的組件有:
- 描述線程的類Thread,代表線程任務的接口Runable;內置條件隊列操作接口Object.wait()/notify()/notifyAll(),它們都位於java.lang包;
- 提供volatile關鍵字,用來保證單操作變量的內存可見性;提供synchronized關鍵字作爲內置鎖,用來保證線程同步
- 提供簡單且效率低下的併發容器,比如Hashtable、Vector等,位於Java.util包。
可以看到,此時的Java對於併發編程的支持還是很簡陋和原始的,比如想要開多條線程只能手動new多個Thread對象。JDK1.5的時候增加了許多線程和同步有關的特性,大大提高了使用Java進行併發編程的效率:
- 加強了volatile關鍵字的語義,JDK1.5開始volatile關鍵字能夠防止編譯器對被聲明volatile的變量進行重排序,即在volatile變量訪問前的代碼不可以排到訪問後;訪問後的代碼不可以排序到訪問前。從而可以真正的用來實現安全的雙重檢測鎖(JDK1.5之前的雙重檢測鎖都是不安全的,因爲volatile關鍵字不具有禁止重排序語義)。
- 增加了java.util.concurrent包,又稱併發包、JUC。JUC中包含了大量在java併發編程中非常有用的工具類,包括五個部分:
a) locks部分:在java.util.concurrent.locks包中,提供更加強大的顯式鎖,比如 重入鎖ReentrantLock、讀寫鎖ReadWriteLock;
b) atomic部分:在java.util.concurrent.atomic包中,提供原子變量類相關的功能,是構建非阻塞算法CAS的基礎,比如AtomicInteger;
c) executor部分:在java.util.concurrent包中,提供線程池相關的功能,用於批量創建、管理線程,比如ThreadPoolExecutor等,以及對線程任務的加強,比如Callable等
d) collections部分:在java.util.concurrent包中,提供一系列高性能的併發容器,比如ConcurrentHashMap、CopyOnWriteArrayList等;
e) tools部分:在java.util.concurrent包中,提供簡單高效的同步工具類,如信號量Semaphore、閉鎖CountDownLatch、柵欄CyclicBarrier等;
本文只是一個JUC的整體架構介紹,後續我們將會詳細介紹JUC包的每一部分的重點內容、源碼!
如果有什麼不懂或者需要交流,可以留言。另外希望點贊、收藏、關注,我將不間斷更新各種Java學習博客!