मुझे आपकी सलाह चाहिए। शुरुआत के लिए मैं पूर्व शर्त का वर्णन करना चाहता हूं।50/50 पढ़ने/लिखने के लिए समवर्ती संग्रह
- मैं किसी तीसरे पक्ष जावा डिफ़ॉल्ट
java.lang.Object
केhashCode()
औरequals()
कार्यान्वयन के साथ वस्तुओं की है।Comparable
इंटरफ़ेस लागू नहीं किया गया है। आकार महत्वहीन है। - मुझे स्मृति में कुछ समय के लिए ऐसी वस्तुओं को स्टोर करने की आवश्यकता है। मैं 50/50 अनुपात में विभिन्न धागे से उन्हें पढ़ और लिखूंगा (लगभग 50% पढ़ता है और 50% लिखता है)।
- वस्तुओं का क्रम महत्वपूर्ण नहीं है। मैं सिर्फ दुकान से कुछ वस्तु लेने की संभावना लेना चाहता हूं, बस इतना ही। के साथ मेरा मतलब है और एक ही समय में हटा दें।
- निश्चित रूप से, मैं इसे सबसे कम मेमोरी खपत के साथ जितनी जल्दी हो सके काम करना चाहता हूं। मैं अपने कोड में किसी भी सिंक्रनाइज़ेशन से बचने की कोशिश कर रहा हूं।
सबसे पहले मैंने स्वयं को इस समस्या को हल करने का प्रयास किया है। मैंने उच्च स्मृति खपत के कारण तुरंत CopyOnWriteArray*
संग्रह को खारिज कर दिया है। मैंने पढ़ा है कि दुर्लभ लिखने के मामले में उनका उपयोग करना बेहतर होता है। ConcurrentHashMap
मेरी ज़रूरतों के लिए सामान्य स्वीट्स में मुझे बनाने के लिए रास्ता नहीं मिला ऑपरेशन परमाणु सिंक्रनाइज़ेशन के बिना। मैंने ConcurrentSkipListSet
संग्रह पर अपनी जांच के साथ रोक दिया है। इसमें pollFirst
विधि है जो पर बहुत अच्छा सूट ऑब्जेक्ट्स लेता है।
मैंने अपने समाधान को ConcurrentSkipListSet
के आधार पर लागू किया है। मुझे एक छोटी सी जानकारी को छोड़कर सब कुछ ठीक काम करता है। जैसा कि मैंने उपरोक्त वस्तुओं का उल्लेख किया है, मैं Comparable
लागू नहीं कर रहा हूं। तो चुने गए संग्रह का उपयोग करने के लिए मुझे किसी भी तरह Comparator
लागू करना होगा। यहां इस इंटरफेस का मेरा कार्यान्वयन है। इस उदाहरण में मैंने अपने ऑब्जेक्ट प्रकार के बजाय सीधे java.lang.Object
का उपयोग किया है। मैंने ऐसा किया है क्योंकि कारण कार्यान्वयन पूरी तरह से समान है, अंतर केवल कक्षा के सामान्य भाग में है।
import java.util.Comparator;
public class ObjectComparator implements Comparator<Object> {
public int compare(Object o1, Object o2) {
return o1.hashCode() - o2.hashCode();
}
}
इस कार्यान्वयन का विपक्ष स्पष्ट है। मैंने पाया है कि no guarantee है कि दो अलग-अलग ऑब्जेक्ट्स में अलग हैश कोड होंगे। ऐसे मामले में कुछ वस्तुओं को खोना संभव है जो स्वीकार्य नहीं है। मैंने अलग-अलग ऑब्जेक्ट्स के बराबर हैश कोड के मामले में कुछ यादृच्छिक संख्या वापस करने का विचार किया है, लेकिन मुझे यकीन नहीं है कि यह ConcurrentSkipListSet
कार्यान्वयन को तोड़ नहीं देगा।
बताई गई स्थिति के बारे में मेरे दो सामान्य प्रश्न हैं।
- यह इस तरह के रूप में जिस तरह से मेरी वस्तु के लिए
Comparator
लागू करने के लिए विभिन्न वस्तुओं के लिए0
नहीं लौटते करने औरConcurrentSkipListSet
संचालनीयता रखने संभव है? - क्या मेरे ऑब्जेक्ट्स को स्टोर करने का कोई और तरीका है?
आपके उत्तरों के लिए अग्रिम धन्यवाद।
आपकी वस्तुएं कितनी बड़ी हैं? यदि आप सेफोरोर भारीपन के कारण <100 ऑब्जेक्ट्स हैं तो CopyOnWrite रणनीति सबसे अच्छी है। और यदि आपके संग्रह बहुत बड़े नहीं हैं तो आप बहुत ही कुशल एल्गोरिदम के साथ ईडन पीढ़ी के लिए सबकुछ फिट कर सकते हैं। – Taky
@Taky संग्रह का आकार निर्दिष्ट नहीं है। यह 100 या 10k हो सकता है। मुझे नहीं पता। मैं इस समस्या को हल करने के लिए कुछ सामान्य तरीका खोजने की कोशिश कर रहा हूं। इसके अलावा मैंने आपकी टिप्पणी के दूसरे भाग को नहीं पकड़ा। "ईडन पीढ़ी" के साथ आपका क्या मतलब है? – artspb
"ईडन पीढ़ी" से मेरा मतलब युवा जेवीएम ऑब्जेक्ट का पूल है। – Taky