Bir ReentrantLock olduğunu yapılandırılmamış aksine synchronized
yapılara - yani kilitlemek için bir blok yapısını kullanmaya gerek yoktur ve hatta yöntemlerle genelinde bir kilit tutabilir. Bir örnek:
private ReentrantLock lock;
public void foo() {
...
lock.lock();
...
}
public void bar() {
...
lock.unlock();
...
}
Bu tür bir akışın bir synchronized
yapıdaki tek bir monitör vasıtasıyla temsil edilmesi imkansızdır .
Bunun yanı sıra, kilit yoklamayıReentrantLock
destekler ve zaman aşımını destekleyen kesilebilir kilit bekler . ayrıca, daha esnek iş parçacığı zamanlamasına olanak tanıyan yapılandırılabilir adalet politikası desteği vardır .ReentrantLock
Bu sınıfın yapıcısı isteğe bağlı bir adalet parametresini kabul eder . Ayarlandığında true
, çekişme altında, kilitler en uzun bekleyen iş parçacığına erişim izni verir. Aksi takdirde, bu kilit herhangi bir erişim sırasını garanti etmez. Birçok iş parçacığı tarafından erişilen adil kilitleri kullanan programlar, varsayılan ayarı kullananlara göre daha düşük genel verim gösterebilir (yani, daha yavaş; genellikle çok daha yavaş), ancak kilit elde etmek ve açlık eksikliğini garanti etmek için zaman zaman daha küçük varyanslara sahip olabilir. Bununla birlikte, kilitlerin adilliğinin iplik programlamanın adilliğini garanti etmediğini unutmayın. Bu nedenle, adil bir kilit kullanan birçok dişten biri, diğer aktif dişler ilerlemez ve şu anda kilidi tutmuyorken, arka arkaya birçok kez elde edebilir. Ayrıca,tryLock
yöntemi adalet ayarına uymaz. Diğer iş parçacıkları bekliyor olsa bile kilidin kullanılabilir olması başarılı olacaktır.
ReentrantLock
ayrıca daha ölçeklenebilir olabilir ve daha yüksek çekişme altında daha iyi performans gösterebilir . Bununla ilgili daha fazla bilgiyi buradan edinebilirsiniz .
Ancak bu iddiaya itiraz edilmiştir; aşağıdaki yoruma bakın:
Evresel kilit testinde her seferinde yeni bir kilit oluşturulur, bu nedenle özel bir kilitleme yoktur ve elde edilen veriler geçersizdir. Ayrıca, IBM bağlantısı, temel ölçüt için hiçbir kaynak kodu sunmadığından, testin doğru bir şekilde yapılıp yapılmadığını belirlemek imkansızdır.
Ne zaman ReentrantLock
s kullanmalısınız ? Bu developerWorks makalesine göre ...
Cevap oldukça basit - synchronized
zamanlanmış kilit beklemeleri, kesilebilir kilit beklemeleri, blok yapısız kilitler, çoklu koşul değişkenleri veya kilit yoklaması gibi sağlamadığı bir şeye ihtiyacınız olduğunda kullanın . ReentrantLock
ölçeklenebilirlik avantajları da vardır ve gerçekten yüksek çekişme gösteren bir durumunuz varsa kullanmalısınız, ancak synchronized
blokların büyük çoğunluğunun yüksek çekişme olsa bile neredeyse hiç çekişme göstermediğini unutmayın . Senkronizasyonun yetersiz olduğu kanıtlanana kadar senkronizasyon ile geliştirmeyi tavsiye edersiniz, yalnızca "performans daha iyi olacaktır"ReentrantLock
. Unutmayın, bunlar ileri düzey kullanıcılar için gelişmiş araçlardır. (Ve gerçekten ileri düzey kullanıcılar, basit araçların yetersiz olduğuna ikna olana kadar bulabilecekleri en basit araçları tercih etme eğilimindedir.) Her zaman olduğu gibi, önce doğru yapın ve daha sonra daha hızlı yapmanız gerekip gerekmediği konusunda endişe edin.