मुझे आश्चर्य है कि निम्नलिखित उदाहरण में डेडलॉक से बचने के वैकल्पिक तरीके क्या हैं। निम्नलिखित उदाहरण एक सामान्य बैंक खाता है जो डेडलॉक समस्या को स्थानांतरित करता है। अभ्यास में इसे हल करने के लिए कुछ बेहतर दृष्टिकोण क्या हैं?डेडलॉक उदाहरण से बचें
class Account {
double balance;
int id;
public Account(int id, double balance){
this.balance = balance;
this.id = id;
}
void withdraw(double amount){
balance -= amount;
}
void deposit(double amount){
balance += amount;
}
}
class Main{
public static void main(String [] args){
final Account a = new Account(1,1000);
final Account b = new Account(2,300);
Thread a = new Thread(){
public void run(){
transfer(a,b,200);
}
};
Thread b = new Thread(){
public void run(){
transfer(b,a,300);
}
};
a.start();
b.start();
}
public static void transfer(Account from, Account to, double amount){
synchronized(from){
synchronized(to){
from.withdraw(amount);
to.deposit(amount);
}
}
}
}
मैं इसे गतिरोध मुद्दे का समाधान होगा अगर मैं नेस्टेड ताला बाहर मेरी हस्तांतरण विधि में की तरह निम्नलिखित
synchronized(from){
from.withdraw(amount);
}
synchronized(to){
to.deposit(amount);
}
आपका उदाहरण क्लासिक डेडलॉक उदाहरण नहीं है। यह हमेशा एक ही थ्रेड के लिए दोनों खाते को लॉक करता है ताकि कोई डेडलॉक न हो। क्या आप इस कोड को अपनी स्थानांतरण विधि में आजमा रहे हैं: स्थैतिक शून्य हस्तांतरण (बैंक खाता, बैंक खाता से, डबल राशि) { सिंक्रनाइज़ (से) { \t से .withdraw (राशि); सिंक्रनाइज़ (से) { to.deposit (राशि); } } } – supernova