मेरे पास एक बहुप्रचारित ऐप लिखना और एक ConcurrentLinkedQueue पढ़ना है, जिसे अवधारणात्मक रूप से किसी सूची/तालिका में प्रविष्टियों के लिए उपयोग किया जाता है। मैंने मूल रूप से इसके लिए एक ConcurrentHashMap का उपयोग किया, जो अच्छी तरह से काम किया। आदेश प्रविष्टियों को ट्रैक करने की आवश्यकता की एक नई आवश्यकता में आया, इसलिए कुछ स्थितियों के आधार पर उन्हें सबसे पुराने क्रम में हटा दिया जा सकता था। ConcurrentLinkedQueue एक अच्छा विकल्प प्रतीत होता है, और कार्यात्मक रूप से यह अच्छी तरह से काम करता है।
स्मृति में एक कॉन्फ़िगर करने योग्य प्रविष्टियां स्मृति में आयोजित की जाती हैं, और जब सीमा तक पहुंचने पर नई प्रविष्टि की पेशकश की जाती है, तो कतार को हटाए जा सकने वाले किसी के लिए सबसे पुराने क्रम में खोजा जाता है। कुछ प्रविष्टियों को सिस्टम द्वारा हटाया नहीं जाना चाहिए और ग्राहक बातचीत की प्रतीक्षा करें।
ऐसा प्रतीत होता है कि मेरे पास होने वाली कतार के सामने एक प्रविष्टि है, जो 100K प्रविष्टियां पहले हुई थी। कतार में कॉन्फ़िगर की गई प्रविष्टियों (आकार() == 100) की सीमित संख्या प्रतीत होती है, लेकिन जब प्रोफाइलिंग हो रही है, तो मैंने पाया कि स्मृति में ~ 100K ConcurrentLinkedQueue $ नोड ऑब्जेक्ट्स थे। यह डिज़ाइन द्वारा प्रतीत होता है, केवल ConcurrentLinkedQueue के स्रोत पर चमक रहा है, एक निकालने केवल ऑब्जेक्ट को संग्रहीत करने के संदर्भ को हटा देता है लेकिन पुनरावृत्ति के लिए लिंक्ड सूची को छोड़ देता है।
अंततः मेरा प्रश्न: क्या इस प्रकृति के संग्रह को संभालने के लिए एक "बेहतर" आलसी तरीका है? मुझे ConcurrentLinkedQueue की गति पसंद है, मैं इस मामले में असंभव रिसाव को बर्दाश्त नहीं कर सकता। यदि नहीं, ऐसा लगता है कि मुझे ऑर्डर ट्रैक करने के लिए दूसरी संरचना बनाना होगा और एक ही समस्या हो सकती है, साथ ही सिंक्रनाइज़ेशन चिंता भी हो सकती है।
यदि आपको यहां जवाब नहीं मिल रहा है, तो http://altair.cs.oswego.edu/mai पर जाएं lman/listinfo/concurrency-interest और वहां अपना प्रश्न पोस्ट करें। शायद ConcurrentLinkedQueue के लेखक आपको निर्णायक उत्तर देंगे। –