मुझे हाल ही में एक प्रश्न पूछा गया जो मुझे रोक दिया गया।बहु-थ्रेडेड वातावरण में स्वैपिंग चर
public void swapEngine(Car a, Car b) {
Engine temp = a.engine;
a.engine = b.engine;
b.engine = temp;
}
यह थ्रेड-सुरक्षित विधि नहीं है। यदि थ्रेड 1 swapEngine(car1, car2)
पर कॉल करता है और फिर थ्रेड 2 swapEngine(car1, car3)
पर कॉल करता है, तो car3
के इंजन के साथ समाप्त होने के लिए यह संभव है। इस समस्या को ठीक करने का सबसे स्पष्ट तरीका synchronize
विधि है।
विधि को सिंक्रनाइज़ करने से संभावित अक्षमता उत्पन्न होती है। क्या होगा यदि थ्रेड 1 swapEngine(car1, car2)
और थ्रेड 2 कॉल swapEngine(car3, car4)
पर कॉल करता है? इन दो धागे एक-दूसरे के साथ हस्तक्षेप नहीं कर सकते हैं। इस मामले में आदर्श स्थिति दो धागे के लिए समानांतर में इंजन को स्वैप करने के लिए होगी। विधि को सिंक्रनाइज़ करने से यह घटित होने से रोकता है।
क्या इन इंजनों को समानांतरता का लाभ उठाने के दौरान इन इंजनों को थ्रेड-सुरक्षित तरीके से स्वैप करने की कोई और तकनीक है?
संपादित करें: मेड विधि सार्वजनिक।
ठीक है, आप लॉक (http://docs.oracle.com/javase/7/docs/api/ जोड़ सकता है जावा/उपयोग/समवर्ती/ताले/Lock.html) कार उदाहरणों के लिए। फिर, आप केवल उन उदाहरणों को लॉक कर सकते हैं जो स्वैपिंग में भाग लेते हैं। – mkrakhin
@mkrakhin यह एक स्वैप (ए, बी) में डेडलॉक प्रवण होगा; स्वैप (बी, ए); 'स्थिति। – Kayaman
@ माबा, उस मामले में एक ही कार दो दुकानों में नहीं हो सकती है :) – Kishore