2016-05-13 139 views
5

Tekil oturum oturum çekirdeklerinde eşzamanlılık yönetimi hakkında bir çalışanla bir tartışma başlattım. Anladığım kadarıyla, 'u okuduktan sonra @ConcurrencyManagement ek açıklamasını bırakırsanız, varsayılan olarak kapsayıcı tarafından yönetilen eşzamanlılık olur. Singleton'ın iş yöntemlerinin veya erişim düzeyini belirtmek için kullanılırTekil Oturum Oturumunda Eşzamanlı Erişimi Yönetme

javax.ejb.Lock ek açıklama ve bir javax.ejb.LockType türü @: belgelerinde aşağıdaki ilgili konteyner yönetilen tekil oturum fasulye devletler Zaman aşımı yöntemleri.

ve

hiçbir @Lock açıklama tekil sınıfına varsa

varsayılan kilit tipi, @Lock (LockType.WRITE), tüm iş ve zaman aşımı yöntemlerine uygulanır. Eğer @ConcurrencyManagement(ConcurrencyManagementType.BEAN) ile fasulye açıklama ise

Şimdi, o zaman fasulye devlet synchronized anahtar kelime ve diğer standart Java eşzamanlılık özelliklerini kullanarak tüm istemciler arasında senkronize sağlamakla sorumludur. makale bile diyor ki: fasulye yönetilen eşzamanlılık singletons oluşturmak

Geliştiriciler eşzamanlı erişim sırasında hataları önlemek için, bu tür senkronizasyonu ve uçucu gibi Java programlama dili senkronizasyon temel öğelerini, kullanma izin verilir.

Sana şeyleri kendiniz senkronize etmek istiyorsanız, @ConcurrencyManagement(ConcurrencyManagementType.BEAN) ile sınıf açıklama gerektiğine inanıyorum bana açan, konteyner tarafından yönetilen eşzamanlılık bölümünde bu yerde görmedim.

İş arkadaşım, bu tartışmayı başlatan fasulyemdeki bu notu gördüğünde "siz erkeklerin garip şeyler yapmasını" söyleyen bir yorum yaptı.

Fasulyelerinin hiçbiri @ConcurrencyManagement ek açıklama içermez, ancak sınıf boyunca synchronized anahtar sözcüğünü kullanır. Kullandığı herhangi bir ince taneli senkronizasyonun anlamsız olduğunu, çünkü tüm iş metotlarının dolaylı bir @Lock(LockType.WRITE) ek açıklamasına sahip olduğunu söyleyebilirmiyim? Bu, eğer bir müşteri kendi yöntemlerinden birini çağırırsa, o zaman başka hiçbir müşteri fasülyenin herhangi bir yöntemini arayamaz, bu nedenle metot içinde açık senkronizasyon işe yaramaz. Örneğin, synchronized (myLock)synchronized (myLock) içinde kullanılan bazı kilit için, iş yöntemlerinden biri içinde kullanılan bazı kilit için, bu kilit için herhangi bir çekişme olmaz çünkü yöntemler etkili bir şekilde senkronize edilir. Yanılıyorsam

düzelt ama onun yöntemleri temelde şu şekilde görünecektir gibi görünüyor: lock bu tekil oturum fasulye oluşturulur

public synchronized void myMethod() { 
    // do stuff 
    synchronized (lock) { 
     // modify mutable state 
    } 
} 

public synchronized void myOtherMethod() { 
    // do other stuff 
    synchronized (lock) { 
     // modify mutable state 
    } 
} 

varsayarsak bu sadece fasulye içinde kesilebilir devlet korumak için, onu konteyner tarafından yönetilen eşzamanlılık kullanıldığında herhangi bir amaca hizmet etmiyor gibi görünüyor.

Bu konuyla ilgili herhangi bir anlayış için şimdiden teşekkür ederiz!

cevap

0

Genel olarak, tüm beklentileriniz doğrudur.İş arkadaşınızın kodunun aslında senkronizasyon ilkellerinden faydalanabileceği küçük bir vaka var.

Bir ejb-jar.xml dosyası varsa, eş zamanlı yönetim yönetimini fasulye tarafından yönetilebilir.

<enterprise-beans> 
    <session> 
     <ejb-name>MySingletonEJB</ejb-name> 
     <ejb-class>com.blah.MySingletonEJB</ejb-class> 
     <transaction-type>Bean</transaction-type> 
     ... 
    </session> 
... 
</enterprise-beans> 

EJB 3 olduğundan, bu şeyler yapmak için kötü bir yol gerçekten ve konfigürasyon doğru kaynakla olduğu için ek açıklamalar kesinlikle tercih edilir: Bu gibi görünecektir.

+0

Bunun projemizde var olduğuna inanmıyorum. “Bunu yıllardır yapıyorum ve gayet iyi çalışıyor” diyerek devam etti, ama söylediklerimi anlayamıyor gibiydi. İyi çalışır, ancak okuduğum şeyin doğru olduğunu varsayarak, "senkronize" blokları gereksiz olur ve iş hacmini artırmazdı. –

+0

Ayrıca onun kodunu test etmek ve senkronizasyonunun gerçekten bir şey yapıp yapmadığını görmek için gerçekten cazip olduğumu da biliyorum, ama yapacak çok işim var ... belki de boş zamanlarım var :) –

0

Doğru, ama ne kilitlendiğine bağlı, eğer nesne sadece o tektona bağlıysa, o zaman aslında aslında programın yürütülmesini yavaşlatmış olan herkesin bildiği bir şeydir. çift ​​kilitleme.