2011-08-24 38 views
9

我已經開始閱讀關於單例會話bean和用於使用容器管理的併發的註釋。與單純使用'synchronized'關鍵字相比,我沒有看到這個好處,所以我懷疑有一些重要的東西我錯過了。從書「Enterprise JavaBeans 3.1」由Rubinger &伯克認爲這個例子中,奧萊理:EJB 3.1容器管理併發與同步

@javax.ejb.Lock(javax.ejb.LockType.READ) 
public String concurrentReadOnlyMethod(){...} 

@javax.ejb.Lock(javax.ejb.LockType.WRITE) 
public void allowOnlyOneWriteAtATimeMethod(String stringToSet){...} 

這怎麼比讀情況下,所有toghether省略了註釋,並在寫的情況下使用​​關鍵字更好,像這樣:

public String concurrentReadOnlyMethod(){...} 

public synchronized void allowOnlyOneWriteAtATimeMethod(String stringToSet){...} 

回答

4

簡單。

「concurrentReadOnlyMethod」完全不同步,因此它不會獲得同步的其他副作用(例如對內存模型中的變量的影響)。此外,READ鎖將阻止WRITE鎖,因此只需同步,就可以讓兩個線程同時運行兩種方法,而使用READ/WRITE鎖則不會。

當你有幾個READ鎖和很少的WRITE鎖時,顯然有更多的價值,因爲所有的READ鎖都可以被共享和同時運行,而WRITE鎖更像一個普通的同步操作。

+1

如果我理解正確,我可以像這樣非正式地說:給定一個包含上述兩個方法的類,使用容器管理併發性,語義是「只要沒有寫入就允許併發讀取」。對比例的語義是「允許併發讀取,也可以在寫入時進行,但一次只能寫入一個線程」。 –

+0

是的,它總結得非常好。 –

+0

您可以給我一個EJB 3.1中READ/WRITE鎖定語義的參考嗎?即使在規範中我也找不到它。 – illEatYourPuppies

2

好,由威爾所說,與​​你不能真正複製的javax.ejb.Lock註釋的行爲,但實際上你可以通過使用ReadWriteLock鎖做到這一點,但是這到底是更多的工作。

作爲一個方面說明,因爲singleton實例不是跨多個JVM(即它們不是分佈式對象)共享的,所以我認爲Lock確實沒有其他好處,它提供了易用性和開箱即用性支持。

請注意,「如果未使用此註釋,則鎖定值(WRITE)被假定爲」,因此您也無法真正擺脫它。