मैं कुछ ऐसी चीज पर काम कर रहा हूं जो स्मृति-मैप की गई फ़ाइलों (FileChannel.map() के माध्यम से) के साथ-साथ मेमोरी प्रत्यक्ष बाइटबफर से निर्मित ByteBuffers का उपयोग करता है। मैं समवर्ती और स्मृति मॉडल बाधाओं को समझने की कोशिश कर रहा हूं।जावा में सीधे मैप किए गए बाइटबफर पर एकाधिक थ्रेड लिख सकते हैं?
मैंने फाइलचैनेल, बाइटबफर, मैप्डबेट बफर आदि जैसी चीजों के लिए सभी प्रासंगिक जावाडोक (और स्रोत) पढ़ा है। ऐसा लगता है कि एक विशेष बाइटबफर (और प्रासंगिक उप-वर्गों) में फ़ील्ड का एक गुच्छा है और राज्य सुरक्षित नहीं है एक स्मृति मॉडल बिंदु से। इसलिए, यदि आप बफर में उस बफर का उपयोग करते हैं तो किसी विशेष बाइटबफर की स्थिति को संशोधित करते समय आपको सिंक्रनाइज़ करना होगा। आम चाल आदि एक ThreadLocal का उपयोग कर ByteBuffer रैप करने के लिए, डुप्लिकेट (जबकि सिंक्रनाइज़) एक नया उदाहरण एक ही मैप किया बाइट्स की ओर इशारा करते प्राप्त करने के लिए, शामिल
को देखते हुए इस परिदृश्य:
- प्रबंधक एक मैप की गई बाइट बफर है
B_all
पूरी फ़ाइल के लिए (कहें कि यह < 2 जीबी) - प्रबंधक एक नया छोटा बाइटबफर
B_1
बनाने के लिए B_all पर डुप्लिकेट(), स्थिति(), सीमा(), और टुकड़ा() कॉल करता है जो फ़ाइल का एक हिस्सा बनाता है और यह देता है थ्रेड टी 1 - मैनेजर एक ही सामान बनाने के लिए करता है
B_2
ByteBuffer ही मैप किया बाइट्स की ओर इशारा करते हैं और इस टी 2 सूत्र में बाँधना
मेरा प्रश्न है देता है: B_2 को B_1 से T1 लिखने और टी 2 लिखने समवर्ती और एक दूसरे के परिवर्तन देखने के लिए गारंटी दी जा सकते हैं? क्या T3 उन बाइट्स को पढ़ने के लिए B_all का उपयोग कर सकता है और टी 1 और टी 2 दोनों में परिवर्तन देखने की गारंटी हो सकता है?
मुझे पता है कि एक मैप किए गए फ़ाइल में लिखना आवश्यक नहीं है प्रक्रिया पर जब तक आप बल() को डिस्क पर पृष्ठों को लिखने के लिए निर्देश देने के लिए बल() का उपयोग नहीं करते हैं। मुझे इसके बारे में परवाह नहीं है। इस सवाल के लिए मान लें कि यह जेवीएम एकमात्र प्रक्रिया है जो एक मैप की गई फाइल लिख रही है।
नोट: मैं अनुमानों की तलाश नहीं कर रहा हूं (मैं उन्हें काफी अच्छी तरह से बना सकता हूं)। मैं स्मृति-मैप किए गए प्रत्यक्ष बफर के लिए गारंटी (या नहीं) के बारे में निश्चित कुछ के संदर्भों को संदर्भित करना चाहता हूं। या यदि आपके पास वास्तविक अनुभव या नकारात्मक परीक्षण के मामले हैं, जो पर्याप्त साक्ष्य के रूप में भी कार्य कर सकते हैं।
अद्यतन: मैंने कई परीक्षणों को समानांतर में एक ही फ़ाइल में लिखने के साथ कुछ परीक्षण किए हैं और अब तक ऐसा लगता है कि वे लिखने तुरंत अन्य धागे से दिखाई देते हैं। मुझे यकीन नहीं है कि मैं उस पर भरोसा कर सकता हूं।
मै मैप्डबेट बफर (जावा 7) के लिए एपीआई पढ़ता हूं और वे चेतावनी देते हैं कि इसे केवल पढ़ने/लिखने के लिए इस्तेमाल किया जाना चाहिए, न कि मैनिप्लेशंस। – toto2
हां, मेरा प्रश्न लगभग दो धागे लिख रहा है। मुझे नहीं पता कि "मैनिपुलेशन" से आपका क्या मतलब है। –
मैपडबेट बफर का जावाडॉक: "मैप किए गए बाइट बफर का सभी या हिस्सा किसी भी समय पहुंच योग्य नहीं हो सकता है, उदाहरण के लिए यदि मैप किए गए फ़ाइल को छोटा कर दिया गया है। मैप किए गए बाइट बफर के एक पहुंचने योग्य क्षेत्र तक पहुंचने का प्रयास बफर की सामग्री को नहीं बदलेगा पहुंच के समय या कुछ समय बाद एक अनिर्दिष्ट अपवाद फेंक दिया जा सकता है। इसलिए यह दृढ़ता से अनुशंसा की जाती है कि इस कार्यक्रम द्वारा मैप किए गए फ़ाइल के ** हेरफेर ** से बचने के लिए उचित सावधानी बरतें, या समवर्ती रूप से फ़ाइल की सामग्री को पढ़ने या लिखने के अलावा प्रोग्राम चला रहा है। " – toto2