Uygulamada bunlardan hangisinin daha iyi olduğunu merak ediyorum ve neden?
Ben Lock
ve Condition
(ve diğer yeni concurrent
sınıflar) araç kutusu için sadece daha fazla araç olduğunu buldum . İhtiyacım olan her şeyi eski pençe çekiçimle ( synchronized
anahtar kelime) yapabilirdim, ancak bazı durumlarda kullanmak garipti. Alet kutuma daha fazla alet eklediğimde, bu garip durumların birçoğu çok daha basit hale geldi: bir lastik tokmak, bir top çekiç, bir prybar ve bazı tırnak zımbaları. ancak , eski pençe çekiçim hala kullanım payını görüyor.
Birinin diğerinden gerçekten "daha iyi" olduğunu düşünmüyorum, aksine her biri farklı sorunlara daha uygun. Özetle, basit modeli ve kapsam odaklı doğası synchronized
beni kodumdaki hatalardan korumaya yardımcı olur, ancak aynı avantajlar bazen daha karmaşık senaryolarda engeldir. Eşzamanlı paketin ele alınmasına yardımcı olmak için oluşturulduğu bu daha karmaşık senaryolar. Ancak bu üst düzey yapıların kullanılması, kodda daha açık ve dikkatli bir yönetim gerektirir.
===
JavaDocLock
ve synchronized
(bu benim vurgu) arasındaki ayrımı açıklamak iyi bir iş düşünüyorum :
Kilit uygulamaları, senkronize yöntemler ve ifadeler kullanılarak elde edilenden daha kapsamlı kilitleme işlemleri sağlar . Daha esnek yapılandırmaya izin verirler , oldukça farklı özelliklere sahip olabilirler ve birden çok ilişkilendirilmiş Koşul nesnesini destekleyebilirler .
...
Kullanımı senkronize yöntemlerle veya beyana her nesne ile ilişkilendirilmiş örtülü monitör kilidine erişim sağlar ancak güçler kilit edinme ve serbest bırakma bir blok yapılandırılmış bir şekilde gerçekleşmesi için : zaman birden kilitler vardır edinilen onlar ters sırayla serbest bırakılmalıdır ve tüm kilitler, edinildikleri sözcüksel kapsamda serbest bırakılmalıdır .
Senkronize yöntemler ve ifadeler için kapsam belirleme mekanizması , monitör kilitleriyle programlamayı çok kolaylaştırırken ve kilitlerle ilgili birçok yaygın programlama hatalarından kaçınmaya yardımcı olurken, kilitlerle daha esnek bir şekilde çalışmanız gereken durumlar vardır. Örneğin, * * bazı algoritmalar * eşzamanlı olarak erişilen veri yapılarını taramak için "el ele" veya "zincir kilitleme" kullanımını gerektirir : A düğümünün kilidini, sonra B düğümünü alır, sonra A'yı serbest bırakır ve C'yi alırsınız, daha sonra B'yi serbest bırakın ve D'yi edinin vb. Kilit arabiriminin uygulamaları, bir kilidin farklı kapsamlarda edinilmesine ve serbest bırakılmasına izin vererek bu tür tekniklerin kullanılmasını sağlar veherhangi bir sırayla birden fazla kilidin alınmasını ve serbest bırakılmasını sağlar .
Bu artan esneklik ile ek sorumluluk gelir . Blok yapılı kilitleme yokluğu kilitler otomatik olarak serbest bırakılmasını kaldırır senkronize yöntem ve tablolar ile oluşur. Çoğu durumda, aşağıdaki deyim kullanılmalıdır:
...
Ne zaman kilitleme ve kilit açma farklı kapsamlarda meydana , bakım için alınması gereken sağlamak olduğunu tutulduğu kilit sırasında yürütülür tüm kod nihayet-denemede tarafından korunan veya denemek-catch olduğu için kilit salıverilmesini sağlamak gerektiğinde.
Kilit uygulamaları sağlayan ek işlevler bir sağlayarak senkronize yöntem ve tabloların kullanımı üzerinde elde etmek engellenmeyen girişimini kilit (tryLock ()), denemesi kesilebilir kilidi elde lockInterruptibly (() ve denemesi edinilen zaman aşımına uğrayabilecek kilit (tryLock (uzun, TimeUnit)).
...