Aşağıda, Etkili Java 2. Edition'ın snippet'i bulunmaktadır. Burada yazar, aşağıdaki kod parçasının, sonuç değişkenini kullanmadığınızdan% 25 daha hızlı olduğunu iddia ediyor. "Bu değişkenin yaptığı şey, alanın önceden başlatılmış olduğu ortak durumda yalnızca bir kez okunmasını sağlamaktır." . Yerel değişken sonucunu kullanmıyorsak, bu kodun değer sıfırlanmasından sonra neden bu kadar hızlı olacağını anlayamıyorum. Her iki durumda da, yerel değişken sonucunu kullanıp kullanmadığınızı, başlattıktan sonra sadece bir uçucu okunacaksınız.Neden çift kilitleme, Joshua Bloch'da% 25 daha hızlıdır Etkili Java Örneği
if (field == null) {...}
return field;
ya: field
kez
// Double-check idiom for lazy initialization of instance fields
private volatile FieldType field;
FieldType getField() {
FieldType result = field;
if (result == null) { // First check (no locking)
synchronized(this) {
result = field;
if (result == null) // Second check (with locking)
field = result = computeFieldValue();
}
}
return result;
}
Uhm, bu ilk baskısı mı? Çifte kontrol edilen kilitleme birkaç yıldan beri vazgeçilmiştir – fge
Ve nedeni: http://stackoverflow.com/questions/4926681/why-is-double-checked-locking-broken-in-java?rq=1 – Lenymm
@fge : Pek sayılmaz. Java 5, bu yana aslında bir OK kalıbı: http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html –