2016-04-04 11 views
5

मुझे एक प्रश्न का सामना करना पड़ा है जिसे मुझे समझने के लिए संघर्ष किया गया है हालांकि मुझे जवाब मिला। कृपया इसे देखें और मुझे उत्तर पर एक स्पष्टीकरण प्रदान करें।ओसीपीजेपी परीक्षा में मल्टीथ्रेडिंग

public class TestSeven extends Thread { 
    private static int x; 
    public synchronized void doThings() { 
    int current = x; 
    current++; 
    x = current; 
    } 
    public void run() { 
    doThings(); 
    } 
} 

सवाल और जवाब दिया कौन सा वाक्य सही है ...?

ए संकलन विफल रहता है।

बी रनटाइम पर एक अपवाद फेंक दिया गया है।

सी। रन() विधि सिंक्रनाइज़ करने से वर्ग थ्रेड-सुरक्षित हो जाएगा।

डी। परिवर्तनीय "एक्स" में डेटा समवर्ती पहुंच समस्याओं से संरक्षित है।

डॉटिंग्स() विधि को स्थिर के रूप में घोषित करने से वर्ग थ्रेड-सुरक्षित हो जाएगा।

एफ। सिंक्रनाइज़ (नया ऑब्जेक्ट()) {} ब्लॉक में doThings() के भीतर बयानों को लपेटना कक्षा थ्रेड-सुरक्षित बना देगा।

बोल्ड को उत्तर के रूप में दिया जाता है। अग्रिम में जवाब के लिए धन्यवाद !!

उत्तर

6

यदि आपके पास सिंक्रनाइज़ किए गए इंस्टेंस विधि की तरह है, तो यह उदाहरण पर सिंक्रनाइज़ करता है, यानी प्रत्येक इंस्टेंस विधि को अपने आप एक्सेस कर सकता है। लेकिन x स्थैतिक है, इसलिए TestSeven का कोई भी उदाहरण इसके साथ-साथ पहुंच सकता है। यदि doThings() स्थिर है, तो यह कक्षा पर सिंक्रनाइज़ होता है, इसलिए केवल एक ही उदाहरण किसी दिए गए समय पर सिंक्रनाइज़ कोड तक पहुंच सकता है।

1

यहां क्या होगा।

public static syncronized void doThings(); 

यह कक्षा स्तर पर विधि सिंक्रनाइज़ करेगा। जिसका मतलब है कि कक्षा का केवल एक उदाहरण समय के उदाहरण पर कोड तक पहुंचने में सक्षम होगा, जिसका अर्थ है कि अन्य उदाहरणों द्वारा संशोधित करने के लिए स्थैतिक चर x की कोई संभावना नहीं है।

अन्य मामले में,

public syncronized void doThings(); 

इसका मतलब है कि doThings(); विधि वर्तमान वस्तु पर सिंक्रनाइज़ किया गया है। यानी TestSeven का एक उदाहरण, इसलिए कई उदाहरण विधि तक पहुंच सकते हैं जो बदले में स्थिर साझा चर x बदल सकता है जो वांछनीय नहीं है।

+0

तो एक स्थिर सिंक्रनाइज़ विधि एक कक्षा में झूठ है, तो इसका मतलब है कि पूरी कक्षा लॉक कर दिया जाएगा ?? यद्यपि उस वर्ग में अधिक सिंक्रनाइज़ और गैर सिंक्रनाइज़ विधि उपलब्ध हैं। –

+0

इसका मतलब है कि केवल एक उदाहरण क्लास लेव पर सिंक्रनाइज़ किए गए कोड को निष्पादित करने में सक्षम होगा। –

+0

मेरा मतलब क्या था एक स्थिर सिंक्रनाइज़ विधि एक वर्ग सिंक्रनाइज़ करने के लिए पर्याप्त होगा ?? (मान लीजिए कि कक्षा में अधिक सिंक्रनाइज़ और गैर-सिंक्रनाइज़ विधि उपलब्ध है) –

1

विधि स्थिर बनाना इसे कक्षा स्तर पर उपलब्ध कराएगा, उदाहरण के स्तर पर नहीं, इसलिए इस वर्ग के सभी ऑब्जेक्ट्स/उदाहरणों के लिए एक स्थिर चर जैसे विधि व्यवहार समान होंगे। तो वर्ग थ्रेड सुरक्षित हो जाएगा क्योंकि विधि व्यवहार उदाहरण विशिष्ट नहीं है

1

थ्रेड सुरक्षित का अर्थ है कि यदि यह एक ही समय में एकाधिक धागे से उपयोग किया जाता है, तो इससे कोई समस्या नहीं होनी चाहिए।

बिना static

public class TestSeven extends Thread { 
     private static int x; 
     public synchronized void doThings() { 
     int current = x; 
     current++; 
     x = current; 
    } 
    public void run() { 
    doThings(); 
    } 
} 

निष्पादित आप TestSeven का एक उदाहरण बनाने के लिए और फोन अपने run() है, यह 1 के रूप में उत्पादन हर बार देना होगा। लेकिन xstatic पर प्रतीक्षा करें, तो क्या हर बार जब आप इसे कॉल करते हैं तो आउटपुट को 1 से बढ़ाया जाना चाहिए? तो यह इंगित करता है कि विधि thread safe नहीं है। यह इतना हम करेंगे करने के लिए:

static

public class TestSeven extends Thread { 
    private static int x; 
    public static synchronized void doThings() { 
    int current = x; 
    current++; 
    x = current; 
    } 
    public void run() { 
    doThings(); 
    } 
} 

साथ निष्पादित याद रखेंsynchronized 'एक तरह से' चीजें सुरक्षित धागा बनाने के लिए है, लेकिन वहाँ अन्य तरीके हैं।

अधिक जानकारी के लिए

देख this

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