जवाब "परमाणु" की अपनी परिभाषा
पर निर्भर करता है मैं atomic
के लिए तीन मान्य परिभाषाओं के बारे में पता:
- परमाणु के रूप में सिंक्रनाइज़: केवल एक ही धागे में से एक पर कोड को क्रियान्वित किया जा सकता है पहर;
- परमाणु एसीआईडी में: सभी क्रिया/ब्लॉक होता है, या इनमें से कोई भी नहीं करता है;
- परमाणु अनियंत्रित के रूप में: एक बार जब ब्लॉक शुरू होता है, तो इसे कार्य स्विचिंग द्वारा भी बाधित नहीं किया जा सकता है।
पहला संभवतः आपके प्रोफेसर का क्या मतलब है, और यह पूरा करना आसान है (नीचे देखें)।
दूसरा (एसीआईडी में परमाणु) का अनुमान लगाया जा सकता है। निचे देखो।
तीसरे स्थान पर जावा में गारंटी नहीं दी जा सकती है - यह अनियंत्रितता के लिए आवश्यक "महत्वपूर्ण खंड" प्राइमेटिव तक पहुंच प्रदान नहीं करती है। सौभाग्य से, इसकी आवश्यकता ऑपरेटिंग सिस्टम और डिवाइस ड्राइवरों तक काफी सीमित है।
परमाणु सिंक्रनाइज़
में के रूप में यह अपेक्षाकृत आसान है: बस एक तुल्यकालन ब्लॉक में कोड के अपने ब्लॉक संलग्न।मैं नीचे एक असतत ब्लॉक के रूप में यह दिखाया गया है, लेकिन वहाँ अन्य विकल्प हैं:
public void doSomethingQuasiAtomic() {
synchronized (exampleLock) {
// Your code block goes here.
// Only one thread will ever be in this block at a time.
...
}
}
परमाणु एसिड
वहाँ ACID
atomicity के लिए कोई सामान्य मामला समाधान है के रूप में, लेकिन यह अनुमान लगाया जा सकता, सिंक्रनाइज़ कोड का भी उपयोग कर रहे हैं। ऐसा करने के लिए, कार्रवाई के प्रत्येक भाग सुरक्षित रूप से उलटा होना चाहिए।
यह मैं इसे कैसे दृष्टिकोण होता है:
तर्क के लिए, वहाँ एक बहुखण्डीय कार्रवाई आप एक वस्तु हम exampleObj
फोन करता हूँ पर क्या करने की जरूरत है, तो आप तीन कार्यों का प्रदर्शन किया जा करने के लिए है कि मान जो सुरक्षित रूप से उलट दिया जा सकता है, और example
पर सभी पहुंच exampleLock
पर सिंक्रनाइज़ की गई है।
synchronized(exampleLock) {
boolean actionOneDone=false;
boolean actionTwoDone=false;
boolean actionThreeDone=false;
try {
actionOneDone=doActionOne(exampleObj); // or perhaps exampleObj.doActionOne();
actionTwoDone=doActionTwo(exampleObj);
actionThreeDone=doActionThree(exampleObj);
} catch (Exception ex) {
// Whatever seems appropriate here.
} finally {
if (! (actionOneDone && actionTwoDone && actionThreeDone)) {
/* At least one part failed. Back out the completed actions in reverse order.
* Note that we never need to reverse action three since if it completed, so did the others.
*/
if (actionTwoDone) {
reverseActionTwo(exampleObj); // or perhaps exampleObj.reverseActionTwo();
}
if (actionOneDone) {
reverseActionOne(exampleObj);
}
}
}
}
परमाणु रूप से किस संबंध में? – SLaks
क्षमा करें मुझे यकीन नहीं है, यह सब हमें प्रश्न के लिए मिला है। यह एक पिछला परीक्षा प्रश्न है और हमें इसे – germantom
का उदाहरण नहीं दिया गया है। यह प्रश्न उत्तर देने के लिए बहुत अस्पष्ट है। – SLaks