-
1 # Java實戰技術
-
2 # 9點10分
①同步
這裡講的同步是指多個執行緒透過synchronized關鍵字這種方式來實現執行緒間的通訊。這種方式,本質上就是“共享記憶體”式的通訊。多個執行緒需要訪問同一個共享變數,誰拿到了鎖(獲得了訪問許可權),誰就可以執行。
②while輪詢的方式
-
3 # 遷徙de麻雀
題主問題太寬泛,這個話題可以寫一本書,比如《JAVA併發程式設計實踐》,甚至一本書也不夠。限於篇幅,我從執行緒的任務抽象,執行緒的實際形態這兩個角度大概說一下。
任務抽象執行緒是對CPU資源的抽象,可以把它對映為一項可執行的任務。從作業系統的多道程式設計到多執行緒設計,實際上是對多工模型的發展,不斷地簡化建模設計難度和充分利用CPU資源。
任務需要操作資源,抽象起來主要包含記憶體資料和來自各種IO裝置的資料。
不同的任務之間需要協作:對任務執行時序的控制,對資源訪問的同步,任務之間的通訊等。
執行緒通訊執行緒在執行時主要可看做一個指令執行序列和相關記憶體資訊(核心態和使用者態,包含堆疊、TLS,核心物件,以及執行時設計的關聯物件)。
如果兩個執行緒位於相同程序,就和程序間通訊IPC等價。
我一般從資訊交換和操作同步兩個方面來看執行緒通訊。
一、資訊交換,本質上就是兩個執行緒可以透過一個公共區域進行訊息交換。這個公共區域對應的原始資源包括暫存器,記憶體,各種IO裝置等。
用Java做開發時,程序內兩個執行緒可以直接使用可公共可訪問物件進行資訊交換。不同程序時,和IPC機制一樣,共享記憶體,檔案系統,管道,網路協議實現元件等等,對應的都有最基本的類庫實現。
二、操作同步
同步的關鍵是鎖,而鎖的核心是原子性,死鎖是最主要的問題。
Java中可用的鎖包含以下幾種:
首先,是CAS介面,在java.util.concurrent.atomic包下面。這個非常重要,你要實現非阻塞鎖,這個要應用自如,無鎖模式也是處理高併發最理想的方式。這塊功能本質上是由CPU提供的基本型別的原子操作。下面的Monitor的無鎖模式也是用CAS實現的。
其次,是虛擬機器封裝的Monitor機制利用物件鎖實現互斥和協作,你用synchronized修飾例項方法、靜態方法、程式碼塊,或者呼叫object的wait、notify,notifyall時,都在用虛擬機器提供的ObjectMonitor功能,落腳點在作業系統提供的訊號量等功能,只要涉及到系統呼叫使用到核心物件,鎖就變重了。關注效能的話可以嘗試深入理解它在無鎖狀態、偏向鎖、輕量級鎖和重量級鎖之間的升降級處理。
最後,就是大量模式設計(比如生產者消費者佇列)和常用資料結構同步化,主要提供程式設計便利。重點可以看看AbstractQueuedSynchronizer類的實現,核心的地方是最終透過Thread.interrupt的synchronized標記落腳到ObjectMonitor。 Semaphore、ReentrantLock的實現也是基於它,官方Api文件還給了一個基於AbstractQueuedSynchronizer實現一個的例子
回覆列表
Object的wait方法、notify方法和notifyAll方法可以實現執行緒間的通訊,wait方法讓當前執行緒等待,同時釋放持有的鎖,notify方法可以喚醒一個等待的執行緒,notifyAll方法可以喚醒所有等待的執行緒,執行緒間採用競爭的策略獲取執行計劃,但是需要注意的是這三個方法需要配合synchronized關鍵字使用。