#執行緒(Threads)
執行緒是 Java 中實現多執行緒(Multithreading)和併發程式設計的核心。每個應用程式都至少有一個主執行緒(main thread),但可以創建更多的執行緒來同時執行多個任務。
這兩種方式都能夠讓多個任務並行執行,但由於執行緒是輕量級的系統資源,創建和管理它們必須小心,否則可能會導致性能問題或資源浪費。
#執行緒同步
在多執行緒環境下,不同執行緒可能會同時讀寫共享資料,這會導致資料不一致的問題。為了防止這種情況,Java 提供了多種同步機制:
synchronized關鍵字:synchronized用於確保某個區塊或方法在同一時間只被一個執行緒訪問,從而避免多執行緒下的競爭條件(race conditions)。它可以用來鎖定物件或方法,使其他執行緒必須等待。
鎖(Locks):Java 的 java.util.concurrent.locks提供了更靈活的鎖機制,例如 ReentrantLock。與 synchronized不同,鎖提供了更多控制權,例如嘗試獲取鎖、非阻塞的鎖以及可中斷的鎖操作。
執行緒安全的資料結構:Java 提供了一些內建的執行緒安全的資料結構,例如 Vector、Hashtable。但在實際開發中,這些通常會被更高效的併發集合(如 ConcurrentHashMap)取代。
#高階併發工具
Java 的 java.util.concurrent套件提供了一些強大的工具來管理和協調多執行緒的操作:
ExecutorService:這是一個框架,用來管理和執行多個執行緒的生命週期。它允許執行緒池(thread pool)的創建,避免頻繁創建與銷毀執行緒,從而提升性能、簡化執行緒的提交、管理和終止。
CountDownLatch:這是一種計數器,用來讓一個或多個執行緒等待,直到其他多個執行緒完成工作。計數器初始設定為一個整數值,每當一個執行緒完成任務時,計數器遞減,當計數器歸零時,等待的執行緒才會繼續執行。
Semaphore:用來限制同一時間內訪問某資源的執行緒數量。它可以用於實現資源的配額控制,確保某些關鍵資源不會被過度佔用。
CyclicBarrier:允許一組執行緒在到達某個同步點後同時繼續執行。當所有執行緒都到達屏障點(barrier),它們才會繼續後續的執行,這對於多執行緒之間的協調有很大幫助。
#併發集合
併發集合是專門為多執行緒環境設計的資料結構,它們能夠高效地處理多執行緒同時訪問的問題,而不需要顯式地使用鎖。