您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> Java >> 关于Java高级编程第2版 死锁的讨论

关于Java高级编程第2版 死锁的讨论

来源:网络整理     时间:2016/8/10 19:14:44     关键词:

关于网友提出的“ 关于Java高级编程第2版 死锁的讨论”问题疑问,本网通过在网上对“ 关于Java高级编程第2版 死锁的讨论”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 关于Java高级编程第2版 死锁的讨论
描述:

旦同步了应用程序对共享资源的访问,就可能会遇到死锁。再以AccountManager应用程序为例,假设同步多个线程所访问的资源(即CustomerAccount对象),如程序清单3-4所示。
程序清单3-4 同步代码块
class TransferManager implements Runnable {
protected CustomerAccount fromAccount;
protected CustomerAccount toAccount;
protected int transferCount;
public TransferManager(CustomerAccount fromacct,
CustomerAccount toacct, int transfers) {
fromAccount = fromacct;
toAccount = toacct;
transferCount = transfers;
}
public void run() {
double balance;
double transferAmount;
for (int i = 0 ; i < transferCount; i++) {
synchronized (fromAccount) {
balance = fromAccount.getBalance();
transferAmount = (int)(balance * Math.random());
balance -= transferAmount;
fromAccount.setBalance(balance);
synchronized (toAccount) {
balance = toAccount.getBalance();
balance += transferAmount;
toAccount.setBalance(balance);
}
}
}
}
}
虽然确实改正了以前潜在的问题,但却可能引入另一个问题:死锁。CustomerAccount应用程序中启动的第一个线程负责从支票账户向储蓄账户转钱,第二个线程负责从储蓄账户向支票账户转钱。因此第一个线程每次执行到run()方法,会先获取支票账户的对象监控再获取储蓄账户的对象监控。第二个线程也需要争取这两个监控,但获取顺序正好相反。
现在假设第一个线程在run()方法运行期间得到支票账户的对象监控,但在获得储蓄账户的监控之前,该线程被中断了。而当第二个线程开始执行循环并成功取得储蓄账户的监控后,就会阻塞在支票账户监控的获取上。这时由于两个线程都已经成功取得对应监控,就会无限期等待另一个监控可用,该例即是死锁。
死锁在多线程应用程序中是很常见的,并往往造成程序挂起。死锁问题至少有两种较简单的解决方案:高层同步和锁定排序。
-------------------------
关于这句话:
现在假设第一个线程在run()方法运行期间得到支票账户的对象监控,但在获得储蓄账户的监控之前,该线程被中断了。而当第二个线程开始执行循环并成功取得储蓄账户的监控后,就会阻塞在支票账户监控的获取上
该线程被中断了------------------但是fromAccount的锁没有被释放,其它线程怎么可能进入fromAccount的锁控制范围呢,也就不会有其它线程占用toAccount的问题了。。。
有没有高人指点一下。。


解决方案1:

注意这句话
第一个线程负责从支票账户向储蓄账户转钱,第二个线程负责从储蓄账户向支票账户转钱。
所以对于线程1 fromAccount是支票账户 toAccount是储蓄账户
对于线程2 fromAccount是储蓄账户 toAccount是支票账户


以上介绍了“ 关于Java高级编程第2版 死锁的讨论”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3195781.html

相关图片

相关文章