मुझे कुंजी-बाध्य महत्वपूर्ण वर्गों की सुरक्षा के लिए प्रति-कुंजी लॉकिंग तंत्र की आवश्यकता है।क्या गुवा का कैश <के, सेमफोर> कमजोर वाले() थ्रेड सुरक्षित होगा?
हालांकि ConcurrentMap<K, Semaphore>
समेकन के लिए पर्याप्त होगा, मैं यह भी नहीं चाहता कि नक्शा पुरानी चाबियाँ जमा करे और अनिश्चित काल तक बढ़े।
आदर्श रूप से, डेटा संरचना आखिरकार (या सीधे बाद में) कुंजी के लिए उपयोग की जाने वाली स्मृति को रिलीज़ करेगी जिसमें ताले का उपयोग नहीं किया जाता है।
मैं एक तरह से सोच रहा हूँ अमरूद के Cache
weakValues()
से बनाया चाल करना होगा:
private static final LoadingCache<K, Semaphore> KEY_MUTEX = CacheBuilder.newBuilder()
.weakValues()
.build(new CacheLoader<K, Semaphore>() {
@Override
public Semaphore load(K key) throws Exception {
return new Semaphore(1);
}
});
वहाँ किसी भी कारण हैं जिनकी वजह यह पर्याप्त संगामिति नियंत्रण प्रदान नहीं कर सकते हैं?
या कारणों से अप्रयुक्त जोड़े को कचरा इकट्ठा क्यों नहीं किया जा सकता है?
किसी को ध्यान रखना चाहिए कि 'com.google.common.util.concurrent.Striped' * प्रति-कुंजी सिंक्रनाइज़ेशन ऑब्जेक्ट की गारंटी नहीं देता है। एक ही ऑब्जेक्ट को साझा करने के लिए एकाधिक कुंजियों की अनुमति है और यह समरूपता को कम कर सकता है। इस प्रकार, 'स्ट्राइप' डिजाइन/उपयोग के मामले के आधार पर एक व्यवहार्य विकल्प हो सकता है या नहीं भी हो सकता है। – antak