java名 java_Java Syncrhonisers
java名 java
線程通信主要通過共享對字段和對象的訪問來發生。 盡管這種通信方式非常高效,但它易于出現諸如線程干擾和內存一致性之類的錯誤。 同步是一種有助于防止此類錯誤的工具。
但是,同步不是免費提供的,并且在訪問當前由另一個線程持有的鎖或對象時會引入延遲。 等待的線程不能使用該對象,直到另一個線程釋放該對象的鎖。 這種情況稱為線程爭用。 它還可能導致死鎖和活鎖。
在本文中,我們將探討Java提供的用于處理線程同步的不同選項。
同步要點
Java提供了一系列機制來處理基本線程同步和協調。 它支持通過同步方法和同步語句進行細粒度的對象訪問同步。 基本線程協調可以通過受保護的塊來完成。 所有提到的機制都是圍繞獲取和釋放對象的固有鎖定而構建的。
內在鎖
每個Java對象都有一個關聯的固有鎖。 需要對對象的字段進行獨占訪問的線程必須在訪問對象之前獲取對象的鎖,然后在完成后釋放固有的鎖。 其他嘗試訪問該對象的線程將阻塞,直到持有鎖的線程將其釋放為止。
同步方法
當線程調用同步方法時 ,它獲取該方法對象的內在鎖 ,并在方法返回時釋放它。 即使該方法由于未捕獲的異常而返回,也將釋放該鎖定。 如果以靜態方法完成,則線程將獲取與該類關聯的類對象的鎖。
同步語句
提供更細粒度的同步機制。 同步語句必須指定提供內部鎖的對象。 在分離的鎖對象上進行同步可以提供字段同步,而無需強制方法調用之間進行同步。
守衛的塊
如前所述,受保護的塊為線程協調提供了支持。 受保護的塊是每個Java對象的一部分,可以使用wait , notify和notifyAll方法構造。
wait方法掛起當前線程。 當線程調用wait時,它必須擁有對象的固有鎖,這就是為什么wait調用通常包裝在同步方法或語句中的原因。 調用wait方法將掛起線程執行并釋放鎖。
在某個時候,另一個線程將獲取對象的固有鎖,并調用notifyAll來通知所有線程,等待發生重要事件。 在第二個線程釋放了鎖之后,等待的線程將重新獲取該鎖,并通過從等待調用中返回來恢復執行。
Notify喚醒單個線程。 無法指定喚醒的具體線程,因此,僅在我們不關心哪個線程被喚醒時才有用。
Java同步器
Java還提供了五個用于通用特殊用途同步的類。
CountDownLatch
CountDownLatch類允許一個或多個線程等待,直到其他線程中的一組操作完成。 它用計數編號初始化。
await方法將阻塞,直到計數達到零為止。
countDown方法減少計數。
當await方法返回時,將釋放所有等待線程,并且隨后的await調用將立即返回。 計數無法重置。
信號
信號量用于限制線程對特定資源的訪問。 初始化具有許多許可證。
acquire方法將阻塞,直到獲得許可證并獲得許可為止。
release方法添加許可,釋放阻止獲取者。
請注意,對release的調用不必與調用Acquisition的線程相同。 信號量可以是公平的,也可以是不公平的 。 如果公平,則線程以FIFO方式獲取許可。
盡管起初它看上去與CountDownLatch類似,但其目的卻完全不同。
循環屏障
CyclicBarrier建立在各方概念的周圍。 它允許線程互相等待以到達公共的障礙點。
await方法將阻塞,直到各方到達為止。 它的行為與CountDownLatch的逆過程相同。 N等待之后,它繼續。
它支持每個障礙點運行一次的可選可運行對象。 在最后一個聚會到達之后,但在釋放之前。 它通常用于更新線程之間的共享狀態。 它是循環的,因為它可以在線程釋放后重用 。
交換者
Exchanger是兩個線程可以交換信息的同步點。
線程將阻塞,直到其對方顯示其信息為止。 雙方都發生相同的行為。
移相器
Phaser是一個可重用的屏障,類似于CountDownLatch和CyclirBarrier ,但更加靈活。
在Phaser中,創建時注冊方的數量不是固定的。 雙方可以在通過任何注冊時register或bulkRegister方法。 雙方可以在抵達時注銷arriveAndDeregister 。
它提供了幾種同步方法。 arriveAndAwaitAdvance方法的行為與CycleBarrier await方法的行為相同。 arrive和arrive并arriveAndDeregister記錄到達,但不要阻塞。 awaitAdvance阻塞,直到各方到達為止。
它可以終止 ,強制所有同步方法返回。 可以通過forceTermination方法強制forceTermination 。
它還提供了監視其狀態的支持。 值得注意的是,同步方法只能由注冊方調用,而狀態可以由任何調用者監視。 監視方法包括getRegisteredParties和getArrivedParties等。
結論
多線程絕對不是一個簡單的問題,但是使用某些語言提供的工具可以更輕松地解決多線程問題。 就個人而言,我不需要每天使用所有工具,但是我認為有必要知道它們的存在以及如何提供幫助。
翻譯自: https://www.javacodegeeks.com/2016/08/the-java-syncrhonisers.html
java名 java
總結
以上是生活随笔為你收集整理的java名 java_Java Syncrhonisers的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 帝国单机游戏电脑版下载(帝国战争游戏单机
- 下一篇: 偷偷告诉你word中快速对齐的小秘密wo