2011-10-06 88 views
7

我意識到在Java中提供的同步塊基本上是一個可重入互斥體的實現。但是,同步塊原子?同步塊 - Java

那麼如何處理當前在同步塊內執行的線程的中斷 - 是否通過恢復到目前爲止所做的所有更改來釋放鎖?

編輯:至於問題的中斷部分 - 它如何通常在Java中處理。例如,我看到很多java代碼示例,其中開發人員在某個線程處於等待隊列中時(例如)會捕獲中斷。但是,在catch塊中,他們所做的只是打印中斷。我對這個線程實際發生了什麼感到好奇嗎?它是否從等待隊列中刪除?

回答

4

- 原子

synchronized塊有助於實現原子 - 但他們的數據操作無法garaunteed是原子的。要使同步塊中的內容成爲原子,通常使用原子數據結構,如getter和setter,例如AtomicBoolean。

有一個偉大的原子類的聚寶盆,像原子詮釋數組,由最新的Java版本支持。

- 處理中斷的方式:

中斷中未明確通過同步處理 - 同步塊只有gaurantee,雖然執行時,該塊不能由另一個線程重新輸入。

2

然而,是同步塊原子?

是的,一個同步塊強制這個塊和任何在同一個對象上同步的塊都是原子的。

中斷的處理方式:

中斷是在Java同步完全不同。每個線程都有一個interruptedStatus標誌,只要您在線程上調用interrupt()就會設置該標誌。諸如Thread.sleep()之類的方法如果設置了中斷標誌則會拋出InterruptedException並暫停其睡眠。

請注意,Thread.sleep()不會在睡眠期間放棄任何鎖定。與同步塊關聯的鎖僅在執行流出塊時纔會釋放。

+0

因此,基本上它是一個程序員捕獲中斷事件,並放棄鎖的情況下,它的內部同步塊? – Hari

+0

@Titan synchronized塊更像是一個作用域鎖,因此放棄該鎖只需通過離開該作用域即可完成。請注意,中斷事件僅僅是低級別線程控制的機制 - 儘管它們可能在相似的時間使用,但它們是正交的概念。 – Bringer128

1

因此,基本上它是一個程序員來捕捉中斷事件,並且 放棄在同步塊內部的情況下鎖嗎?

您不必處理鎖定。由於寫在JLS 14.18synchronized聲明

如果塊的執行正常完成,那麼鎖是 解鎖和同步語句正常完成。如果 由於任何原因突然完成,則 鎖被解鎖,同步語句突然完成 ,原因相同。