2016-02-15 3 views
6

मुझे कुंजी-बाध्य महत्वपूर्ण वर्गों की सुरक्षा के लिए प्रति-कुंजी लॉकिंग तंत्र की आवश्यकता है।क्या गुवा का कैश <के, सेमफोर> कमजोर वाले() थ्रेड सुरक्षित होगा?

हालांकि ConcurrentMap<K, Semaphore> समेकन के लिए पर्याप्त होगा, मैं यह भी नहीं चाहता कि नक्शा पुरानी चाबियाँ जमा करे और अनिश्चित काल तक बढ़े।

आदर्श रूप से, डेटा संरचना आखिरकार (या सीधे बाद में) कुंजी के लिए उपयोग की जाने वाली स्मृति को रिलीज़ करेगी जिसमें ताले का उपयोग नहीं किया जाता है।

मैं एक तरह से सोच रहा हूँ अमरूद के CacheweakValues() से बनाया चाल करना होगा:

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); 
      } 
     }); 

वहाँ किसी भी कारण हैं जिनकी वजह यह पर्याप्त संगामिति नियंत्रण प्रदान नहीं कर सकते हैं?

या कारणों से अप्रयुक्त जोड़े को कचरा इकट्ठा क्यों नहीं किया जा सकता है?

उत्तर

3

हाँ, यह काम करेगा।

इस उपयोग के मामले में कम या कम डेटा संरचना भी बनाई गई है: Striped

+1

किसी को ध्यान रखना चाहिए कि 'com.google.common.util.concurrent.Striped' * प्रति-कुंजी सिंक्रनाइज़ेशन ऑब्जेक्ट की गारंटी नहीं देता है। एक ही ऑब्जेक्ट को साझा करने के लिए एकाधिक कुंजियों की अनुमति है और यह समरूपता को कम कर सकता है। इस प्रकार, 'स्ट्राइप' डिजाइन/उपयोग के मामले के आधार पर एक व्यवहार्य विकल्प हो सकता है या नहीं भी हो सकता है। – antak

संबंधित मुद्दे