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
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!
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ı. –
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 :) –