2009-03-28 19 views
12

क्याऔर AtomicInteger[] के अर्थ में कोई अंतर है? और कौन सा उपयोग करने के लिए तेज़ है? (केवल एक चीज जो मैंने देखी है वह है कि पहले बहुत कम जगह ले रही है, लेकिन इसका मतलब है कि प्रत्येक रिकैक सरणी की सीमाओं की जांच कर रहा है, जिससे यह धीमा हो जाएगा?)परमाणु इंटेगरएरे बनाम परमाणु इंटेगर []

संपादित करें: एक परिदृश्य में जहां सरणी पूर्व- प्रारंभ।

उत्तर

8

AtomicInteger[] प्रति तत्व एक वस्तु की आवश्यकता होगी। AtomicIntegerArray को केवल AtomicIntegerArray ऑब्जेक्ट और एक सरणी ऑब्जेक्ट की आवश्यकता है। तो यदि संभव हो तो उत्तरार्द्ध का उपयोग करें।

सामान्य सरणी के लिए सीमाओं की जांच की लागत काफी छोटी है। महत्वपूर्ण बात यह हो सकती है कि एकाधिक प्रोसेसर से उसी कैश लाइन में डेटा तक पहुंच महत्वपूर्ण प्रदर्शन समस्याओं का कारण बन सकती है। इसलिए अलग वस्तुओं, या जानबूझकर एक सरणी के करीबी तत्वों से परहेज, मदद कर सकते हैं।

+0

सीमा शुल्क के बारे में कौन परवाह करता है? यदि आप (स्पष्ट) स्रोत कोड को देखते हैं, तो कहें, प्राप्त करें और प्राप्त करें यह प्राप्त करने और तुलना करने के लिए पता गणना करता है और तुलना करें (हालांकि इससे भी बदतर, अधिकांश प्रोसेसर बिना किसी कैस के सेट-एंड-सेट कर सकते हैं)। –

+0

tnx (वहां आपका दूसरा पैराग्राफ नहीं देखा गया) तो यह अच्छा हो सकता है कि सभी ऑब्जेक्ट्स एक ही समय में न बनाएं? (या कुछ यादृच्छिक क्रम के साथ?) – Sarmun

+0

(मैंने एक त्वरित संपादन किया था।) विभिन्न समय पर ऑब्जेक्ट्स बनाना, जीसी को पुनर्व्यवस्थित करने में मदद नहीं करेगा। Java.util.concurrent में कक्षाओं में से एक जहां तक ​​बहुत सारे पैडिंग (हाल के संस्करणों में) जोड़ने के लिए जाता है। यह परमाणु इंटेगरएरे में पैडिंग तत्व जोड़ने के लिए आसान और स्पष्ट होना चाहिए, बस बाएं स्थानांतरित करें। –

0

मैं टॉम Hawin के पहले पैराग्राफ के साथ सहमत ...

AtomicInteger [] तत्व प्रति एक वस्तु की आवश्यकता होगी। परमाणु इंटेगरएरे को केवल AtomicIntegerArray ऑब्जेक्ट और एक सरणी ऑब्जेक्ट की आवश्यकता होती है। तो यदि संभव हो तो उत्तरार्द्ध का उपयोग करें।

... लेकिन यह भी ध्यान दिया जाना चाहिए कि AtomicInteger [] थ्रेड सुरक्षित नहीं है। विशेष रूप से, अलग-अलग थ्रेड से एक्सेस किए जाने पर व्यक्तिगत परमाणु इंटेगर ऑब्जेक्ट्स के सरणी के संदर्भ सही हो सकते हैं या नहीं भी हो सकते हैं। सरणी ऑब्जेक्ट पर पहुंच सिंक्रनाइज़ करने से, हालांकि इस समस्या को खत्म कर दिया जाएगा।

+2

परमाणु * के बारे में बिंदु यह है कि आप सिंक्रनाइज़ेशन से बचें। एक परमाणु इंटेगर [] के उपयोग की अनुमानित विधि सभी परमाणु इंटीग्रेटर्स को एक बार बनाने के लिए है और केवल सरणी को सुरक्षित रूप से प्रकाशित करें। –

+1

मैं सहमत हूं। मैं परमाणु इंटेगर [] का उपयोग करने की वकालत नहीं कर रहा हूं, केवल अंतर को ध्यान में रखते हुए, यही सवाल है :) –

4
  • परमाणु इंटेगर [] थ्रेड सुरक्षित पूर्णांक की एक सरणी है।
  • AtomicIntegerArray पूर्णांक की थ्रेड-सुरक्षित सरणी है।
2

नीचे, परमाणु इंटेगर और परमाणु इंटेगरएरे आमतौर पर पढ़ने, लिखने और अन्य सीएएस संचालन करने के लिए समान निम्न स्तर एपीआई का उपयोग करते हैं। (उदाहरण के लिए, ओपनएसडीके 7 दोनों वर्गों में सीएएस संचालन करने के लिए sun.misc.Unsafe का उपयोग करता है।) इसलिए परमाणु इंटेगर [] का उपयोग करने में थोड़ा प्रदर्शन लाभ होता है। जैसा कि आपने पहले ही उल्लेख किया है, परमाणु इंटेगरएरे का उपयोग में महत्वपूर्ण स्मृति फायदे हैं।

एक व्यावहारिक नोट पर, बाद में उपयोग आपको अपने सभी परमाणु इंटेगर उदाहरणों को बनाने से मुक्त करता है। याद रखें कि आप सहमति के कारणों से उन लोगों को आलसी रूप से आवंटित नहीं कर सकते हैं; आपको कुछ सुरक्षित प्रकाशन तंत्र को पूर्व-आवंटित या उपयोग करना होगा। तो स्मृति फायदे के अलावा, आपका कोड क्लीनर है।

एक समान नस पर, आप AtomicInteger सदस्यों के साथ वस्तुओं का एक समूह, उदाहरण के लिए, यदि:

class ReadCounter { 
    private final String _fileName; 
    private final AtomicInteger _readCount; 
    ... 
} 

private final Map<String, ReadCounter> _counterByName = ...; 

तो फिर तुम एक volatile int के रूप में सदस्य चर _readCount मॉडलिंग और AtomicIntegerFieldUpdater का उपयोग करके समान स्मृति सुधार प्राप्त कर सकते हैं।

+0

अद्यतनकर्ता संचालन के लिए कम गति की कीमत पर (हालांकि प्राप्त करें और सेट तेज हैं)। कभी-कभी एटमिक * से स्मृति बचत हैक के रूप में विस्तार करने लायक है। –

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