2013-05-27 5 views
5

synchronized + yöntemi wait() anahtar kelimesi yerine Locks (java.util.concurrent.locks.Lock) ve yöntem notify() tamamen aynı mı?Açık Locks ile Implicit Locks

Ben iplik-güvenli Can kilitleri (açık kilitler) ziyade örtük kilitler (synchronized) kullanılarak programlamak?

Bildiğim kadarıyla her zaman gizli kilitler kullanıyordum. isLocked(), getLockQueueLength(), getHoldCount(), vb. Gibi Lock arabirimi gibi uygulamaların sağladığı avantajların farkındayım, ancak yine de eski okul yolu (wait() ve notify()) bu yöntemlere sahip olmanın dışında başka sınırlara sahip olur mu?

Ben de açlık eksikliği sağlayan bir (boolean adalet) parametresi ile bir kilit inşası konusunu farkındayım.

+1

Peki, tamamen% aynı,% 100 özdeş, sonra birinin varlığı gereksiz olurdu ;-) –

+1

@Joachim Sauer Kesinlikle bir programlama dilinin iki özdeş olması ilk kez olmayacaktı aynı şeyi yapmanın yolları. – Patashu

+1

@Patashu: kesinlikle değil. Ancak, en azından bazı avantajlar olmasaydı ('isLocked() 'yöntemi gibi) birincisinden çok uzun bir süre sonra ikinci bir seçenek ekleyemezlerdi. –

cevap

7

Evet, kesinlikle java.util.concurrent.locks.Lock kullanarak thread-safe program yazabilirsiniz. java.util.concurrent.locks.Lock'un ReentrantLock gibi herhangi bir uygulamasını görüyorsanız, iç uygulama eski synchronized bloklarını kullanır.

Kilit uygulamaları senkronize yöntem ve ifadeleri kullanılarak elde edilebilir daha kapsamlı bir kilitleme çalışma sağlar. Daha esnek yapılandırmaya izin verirler, oldukça farklı özelliklere sahip olabilirler ve birden fazla ilişkili Koşul nesnesini destekleyebilirler.

Farkıma eklemek için synchronized anahtar sözcüğü doğal olarak dil desteğinde yerleşik olarak bulunur. Bu, JIT'in'u Locks ile yapamayacağı şekilde optimize edebileceği anlamına gelebilir. Örneğin. synchronized blocks'u birleştirebilir. senkronize, kilitlemeye erişen az sayıda iplik için en iyisidir ve Lock, aynı kilitlere erişen çok sayıda iş parçacığı için en iyi olabilir. Ayrıca synchronized bloğu, 'u no'lu kağıda girmeyi bekleyen iş parçacıklarının erişim izni verildiğini garanti etmez.

2

Kilitler ve synchronized blok aynı anlamlara sahip ve Java Hafıza Modeli perspektifinden aynı güvence verme. En önemli fark, Kilitler daha fazla kontrol sağlar (tryLock ile veya bir kilit istemek için adil istendiğinde vb.), Daha esnek ve ince taneli bir kilit yönetimi sağlar. Ancak, bu ek özelliklere ihtiyacınız olmadığında, odanın hataya indirgenmesi nedeniyle düz bir eski synchronized bloğu kullanmak daha iyidir (ör., unlock için "unutma").