मैं बहुत साधारण प्रोग्राम है जो साधारण गतिरोध, जहां संसाधन एक के लिए धागा एक प्रतीक्षा करता संसाधन बी के लिए थ्रेड बी और थ्रेड बी प्रतीक्षा करता है के द्वारा बंद कर थ्रेड ए द्वारा बंद कर नकल लिखने के लिए कोशिश कर रहा हूँनवागंतुकों के लिए जावा - गतिरोध नकली
//it will be my Shared resource
public class Account {
private float amount;
public void debit(double amount){
this.amount-=amount;
}
public void credit(double amount){
this.amount+=amount;
}
}
यह मेरा runnable है जो ऊपर संसाधन पर ऑपरेशन करता है::
public class BankTransaction implements Runnable {
Account fromAccount,toAccount;
float ammount;
public BankTransaction(Account fromAccount, Account toAccount,float ammount){
this.fromAccount = fromAccount;
this.toAccount = toAccount;
this.ammount = ammount;
}
private void transferMoney(){
synchronized(fromAccount){
synchronized(toAccount){
fromAccount.debit(ammount);
toAccount.credit(ammount);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Current Transaction Completed!!!");
}
}
}
@Override
public void run() {
transferMoney();
}
}
और अंत में अपने मुख्य वर्ग:
यहाँ मेरी कोड है
public static void main(String[] args) {
Account a = new Account();
Account b = new Account();
Thread thread1 = new Thread(new BankTransaction(a,b,500));
Thread thread2 = new Thread(new BankTransaction(b,a,500));
thread1.start();
thread2.start();
System.out.println("Transactions Completed!!!");
}
}
यह कोड सफलतापूर्वक निष्पादित क्यों चलता है और मेरे पास नहीं है और मृतक है?
नींद गैर-निर्धारणा को पेश कर सकती है। आप इसे निर्धारिती बना सकते हैं; नीचे मेरा जवाब देखें। – Toby
@Toby: हाँ, आप इसे निर्धारिती बना सकते हैं - लेकिन 'नींद' यह दिखाने का एक अच्छा तरीका है कि डेडलॉक * कैसा * हो सकता है, क्योंकि आप हमेशा बिना किसी कार्यक्रम के कल्पना कर सकते हैं जो नींद का उपयोग करता है, जो * नींद का उपयोग करता है, बस धागे के आधार पर निर्धारित नहीं किया जा रहा है। दूसरे शब्दों में, एक प्रोग्राम जो नींद डालने पर विफल रहता है वह स्वाभाविक रूप से त्रुटिपूर्ण है क्योंकि आप वास्तविक जीवन में "गलती से" देख सकते हैं। नोटिफिकेशन डालने के साथ भी यह सच नहीं है। –