2011-11-04 11 views
8
public static int rank(int key, int[] a) { 
     int lo = 0; 
     int hi = a.length - 1; 
     while (lo <= hi) { 
      // Key is in a[lo..hi] or not present. 
      int mid = lo + (hi - lo)/2; 
      if  (key < a[mid]) hi = mid - 1; 
      else if (key > a[mid]) lo = mid + 1; 
      else return mid; 
     } 
     return -1; 
    } 

उपरोक्त स्थैतिक विधि बाइनरी खोज करता है। क्या यह धागा सुरक्षित है? मुझे पता है कि स्थानीय चर धागे सुरक्षित हैं लेकिन "ए" यहां एक सरणी है, इसका मतलब है कि यह जावा में एक वस्तु है, है ना? क्या यही समस्या है? सरणी को पढ़ा जा रहा है, किसी भी तरह से संशोधित नहीं किया गया है, इसलिए मुझे लगता है कि यह विधि थ्रेड-सुरक्षित है। लेकिन मैं यह सुनिश्चित करना चाहता हूं कि मैं क्यों समझता हूं।क्या एक स्थिर विधि धागे में जावा सरणी सुरक्षित हैं?

धन्यवाद!

उत्तर

7

नहीं सरणियों नहीं हैं आम तौर पर थ्रेडसेफ। चाहे आपका कोड इस मामले में है, इस पर निर्भर करता है कि अन्य थ्रेडों में आपके द्वारा पारित सरणी तक पहुंच है या नहीं। क्योंकि सरणी संदर्भ द्वारा पारित की जाती हैं, फिर अन्य धागे तक पहुंच हो सकती है।

यदि आप केवल एक थ्रेड में सरणी बनाते/संशोधित करते हैं, या यदि आप एक प्रतिलिपि में कॉपी की गई प्रतिलिपि में गुजरते हैं तो यह ठीक होगा।

+0

मैं देखता हूं। तो कोड धागा सुरक्षित नहीं है भले ही सरणी संशोधित नहीं है, है ना? लेकिन जब तक कि प्रत्येक थ्रेड जो इस विधि को कॉल करता है, वह एक अलग सरणी वस्तु के साथ करता है, जीवन अच्छा है। – user247866

+4

बीटीडब्ल्यू - मुझे नहीं लगता कि यह कहने का अधिकार है कि उस सरणी संदर्भ द्वारा पारित की जाती हैं (लेकिन मैं समझता हूं कि आपका क्या मतलब है)। अधिक सटीक कहने के लिए कि सरणी संदर्भ मूल्य से पारित किया जाता है। धन्यवाद! – user247866

+1

केवल इसलिए कि कुछ अन्य थ्रेड इसे उसी समय संशोधित कर सकते हैं जब आप इसे पढ़ रहे हों। –

0

हाँ, यह धागा सुरक्षित है, जैसा कि आप कहते हैं कि तुम केवल सरणी पढ़ा है, तभी संभव मुसीबत एक एक और धागा सरणी एक ही समय अपडेट कर रहा है, तो के रूप में इस विधि इसे पढ़ता है हो सकता है

+4

एक और धागा अभी भी उसी पल में सरणी का एक आइटम संपादित कर सकता है। – BalusC

+0

हां, यही मेरा मतलब है कि –

+1

वह शुरुआत में आपके उत्तर में नहीं था, आपने इसे बाद में 5 मिनट की छूट अवधि के भीतर संपादित किया। – BalusC

1

विधि स्वयं थ्रेड-सुरक्षित है, क्योंकि यह केवल अपने तर्क लेता है और उन्हें किसी अन्य थ्रेड पर प्रकाशित किए बिना पढ़ता है। लेकिन इसका मतलब यह नहीं है कि आपको थ्रेडिंग समस्या नहीं हो सकती है। यह सब इस बात पर निर्भर करता है कि तर्क कहां से आते हैं।

यदि तर्क धागे के बीच साझा स्थिति का गठन करते हैं, तो इस राज्य की हर पहुंच को किसी भी तरह सिंक्रनाइज़ किया जाना चाहिए। लेकिन आपको इस स्थिति तक पहुंच की सुरक्षा के लिए धागे के बीच सिंक्रनाइज़ेशन नीति स्थापित करनी होगी। तो इस विधि, या इस विधि के कॉलर को यह सुनिश्चित करना चाहिए कि राज्य तक पहुंच थ्रेड-सुरक्षित है। यह जानने के बिना कि तर्क कहां से आते हैं, यह कहना असंभव है कि यह कोड थ्रेड-सुरक्षित है या नहीं।

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