Eş zamanlılık geri dönüş. Şimdiye kadar double checked locking
değişkeninin çalışması için değişkenin volatile
olarak bildirilmesi gerektiği açıktır. Ama sonra çift kilitli kilitleme aşağıdaki gibi kullanılır.Çift denetlemeli kilitleme ile düzenli HashMap
class Test<A, B> {
private final Map<A, B> map = new HashMap<>();
public B fetch(A key, Function<A, B> loader) {
B value = map.get(key);
if (value == null) {
synchronized (this) {
value = map.get(key);
if (value == null) {
value = loader.apply(key);
map.put(key, value);
}
}
}
return value;
}
}
Neden gerçekten ConcurrentHashMap olmak zorunda değil düzenli HashMap geliyor? Tüm harita modifikasyonları synchronized
bloğunda yapılır ve kod tekrarlayıcıları kullanmaz, bu nedenle teknik olarak "eşzamanlı modifikasyon" problemleri olmamalıdır. Ben kavram değil API kullanımı hakkında soruyorum olarak
putIfAbsent
/computeIfAbsent
kullanımını öneren kaçının :) Bu API kullanarak HashMap
vs ConcurrentHashMap
konuya katkıda sürece.
Güncelleme 2016-12-30
Bu soru yapısını değiştirmez aşağıda Holger "HashMap.get
tarafından bir açıklama ile cevap verdi, fakat get
bir çağırma dışında olduğundan put
sizin çağırma. Does edildi Senkronize bloğun eşzamanlı olarak gerçekleşen bir put
işleminin eksik durumunu görebilir. " Teşekkürler!
Bazı konduktan sonra harita yeniden boyutlandırılacağından ve kesinlikle açılmamış çağrılarınızı kesecektir. –
putIfAbsent/computeIfAbsent atomiktir ve sadece kolaylık sağlamak için değil, –
Thomas, lütfen "çağrıları ara" konusunda ayrıntılı bilgi verir misiniz? Belgelerdeki eşzamanlı kotalar ve yineleyiciler için yalnızca açık referanslar buldum ve "hashmap eşzamanlı erişim" için arama yaparken –