2012-08-15 44 views
7

जो मुझे पता है और शोध किया गया है, synchronized जावा में कीवर्ड बहु-थ्रेडेड एक्सेस को संभालने के लिए विधि या कोड ब्लॉक कथन को सिंक्रनाइज़ करने देता है। यदि मैं बहु-थ्रेडेड वातावरण पर लेखन उद्देश्यों के लिए फ़ाइल लॉक करना चाहता हूं, तो को सर्वोत्तम परिणाम प्राप्त करने के लिए Java NIO package में कक्षाओं का उपयोग करना चाहिए। कल, मैं फ़ाइल I/O संचालन के लिए एक साझा सर्वलेट को संभालने के बारे में एक प्रश्न के साथ आया हूं, और बलुससी टिप्पणियां समाधान के साथ मदद करने के लिए अच्छी हैं, लेकिन this answer में कोड मुझे भ्रमित करता है। मैं समुदाय से नहीं पूछ रहा हूं "उस पोस्ट को जलाएं" या "चलो उसे नीचे छोड़ दें" (ध्यान दें: मैंने इसे या कुछ भी कम नहीं किया है, और मेरे पास जवाब के खिलाफ कुछ भी नहीं है), अगर कोड खंड टूट सकता है तो मैं स्पष्टीकरण मांग रहा हूं एक अच्छा अभ्यास पर विचार किया जाफ़ाइल ऑब्जेक्ट को सिंक्रनाइज़ करें

private static File theFile = new File("theonetoopen.txt"); 

private void someImportantIOMethod(Object stuff){ 
    /* 
     This is the line that confuses me. You can use any object as a lock, but 
     is good to use a File object for this purpose? 
    */ 
    synchronized(theFile) { 
     //Your file output writing code here. 
    } 
} 
+1

+1 क्योंकि अब आप 4000 से अधिक हैं। – Hassan

+1

@ हसन जो भी हो और जो भी प्रतिष्ठा है, तब तक ऐसा न करें जब तक आपको लगता है कि प्रश्न/उत्तर सहायक नहीं है। –

+0

@ नंदकुमार मुझे यह प्रश्न पसंद है, मैंने सोचा कि यह मनोरंजक था। – Hassan

उत्तर

4

समस्या एक फ़ाइल वस्तु पर ताला लगा के बारे में नहीं है - आप किसी भी वस्तु पर लॉक कर सकते हैं और यह वास्तव में बात (कुछ हद तक) नहीं करता है।

मुझे क्या हमलों है कि आप एक गैर अंतिम मॉनिटर का उपयोग कर रहे हैं, इसलिए यदि आपके कोड के किसी अन्य भाग thefile पुनर है: theFile = new File();, अगले धागा है कि चारों ओर आता है एक अलग वस्तु के साथ लॉक हो जाएगा और आप किसी भी गारंटी नहीं है कि आपका कोड एक साथ 2 धागे द्वारा निष्पादित नहीं किया जाएगा।

theFile अंतिम था, कोड ठीक रहेगा, हालांकि निजी मॉनीटर का उपयोग करना बेहतर है, यह सुनिश्चित करने के लिए कि कोड का एक और टुकड़ा अन्य लॉकिंग उद्देश्यों के लिए इसका उपयोग नहीं करता है।

+0

हाँ मुझे पूरा यकीन है कि इससे कोई फर्क नहीं पड़ता कि इस मामले में लॉक एक फ़ाइल है (लापता 'अंतिम' के अलावा जैसा कि yall द्वारा नोट किया गया है)। यदि कुछ भी यह भ्रमित कोड है क्योंकि यह जेआरई भूमि और फ़ाइल सिस्टम भूमि के बीच कुछ कनेक्शन सुझाता है जब वहां (संभवतः) एक नहीं होता है। – dsummersl

+0

हां, 'अंतिम' कीवर्ड अंतर में बताएगा, जैसा कि पोस्ट में बताया गया है [जावा में सिंक्रनाइज़ेशन कैसे काम करता है?] (Http://javarevisited.blogspot.com/2011/04/synchronization-in-java-synchronized.html)। जिस चीज ने मुझे भ्रमित किया वह 'फाइल' ऑब्जेक्ट का उपयोग करके कोड ब्लॉक लॉक कर रहा था, वास्तव में मुझे जावा लॉक और फ़ाइल पर ओएस लॉक के लिए भ्रमित हो गया, लेकिन मुझे लगता है कि ये ताले बहुत अलग हैं। –

1

क्या आपने देखा था: final Object lock = new Object() क्या आप पूछेंगे?
रूप @assylias ने बताया समस्या यह है कि ताला final यहाँ नहीं

1

जावा में हर वस्तु तुल्यकालन के लिए एक ताला के रूप में कार्य कर सकता है। उन्हें आंतरिक ताले कहा जाता है। एक समय में केवल एक धागा किसी दिए गए लॉक द्वारा संरक्षित कोड के ब्लॉक को निष्पादित कर सकता है।

अधिक उस पर: http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

पूरे विधि के लिए सिंक्रनाइज़ कीवर्ड का उपयोग आपके आवेदन पर प्रदर्शन प्रभाव हो सकता है। यही कारण है कि आप कभी-कभी सिंक्रनाइज़ ब्लॉक का उपयोग कर सकते हैं।

आपको याद रखना चाहिए कि लॉक संदर्भ बदला नहीं जा सकता है। सबसे अच्छा समाधान अंतिम कीवर्ड का उपयोग करना है।

2

यदि आपको केवल एक ही एप्लिकेशन में फ़ाइल को लॉक करने की आवश्यकता है तो यह ठीक है (माना जाता है कि final जोड़ा गया है)।

ध्यान दें कि यदि आप अलग-अलग वर्ग लोडरों का उपयोग करके कक्षा को एक से अधिक बार लोड करते हैं तो समाधान काम नहीं करेगा। उदाहरण के लिए, यदि आपके पास एक वेब एप्लिकेशन है जो उसी वेब सर्वर में दो बार तैनात किया गया है, तो एप्लिकेशन के प्रत्येक इंस्टेंस में अपनी लॉक ऑब्जेक्ट होगी।

जैसा कि आप उल्लेख करते हैं, यदि आप लॉकिंग को मजबूत करना चाहते हैं और फ़ाइल को अन्य प्रोग्राम्स से भी लॉक किया गया है, तो आपको FileLock का उपयोग करना चाहिए (दस्तावेज़ों को देखें, कुछ सिस्टमों पर यह गारंटी नहीं है कि सभी प्रोग्राम लॉक का सम्मान करना चाहिए) ।