首頁>Club>
12
回覆列表
  • 1 # Java實戰技術

    Object的wait方法、notify方法和notifyAll方法可以實現執行緒間的通訊,wait方法讓當前執行緒等待,同時釋放持有的鎖,notify方法可以喚醒一個等待的執行緒,notifyAll方法可以喚醒所有等待的執行緒,執行緒間採用競爭的策略獲取執行計劃,但是需要注意的是這三個方法需要配合synchronized關鍵字使用。

  • 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實現一個的例子

  • 中秋節和大豐收的關聯?
  • 怎麼測試光纖的光衰,怎樣檢測光纖線?