博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA并发编程学习笔记------锁顺序死锁
阅读量:4481 次
发布时间:2019-06-08

本文共 2272 字,大约阅读时间需要 7 分钟。

一、需求描述:

  将资金从一个账户转移到另一个账户。

二、程序实现:

(1)账户类:

public class Account {    private long account;    public Account(String user, long account) {        this.account = account;    }    public Account() {        super();    }    public long getAccount() {        return account;    }    public void setAccount(long account) {        this.account = account;    }    public void debit(long money){        this.account -= money;    }    public void credit(long money){        this.account += money;    }}

  (2)资产转移类:

public class TransMoney {    private static final Object tieLock = new Object();    public static void transferMoney(Account fromAccount,Account toAccount,long amount){        synchronized (fromAccount){            synchronized (toAccount){                fromAccount.debit(amount);                toAccount.credit(amount);            }        }    }}

  (3)测试类:

public class DemonstrateDeadLock {    private static final int NUM_THREADS = 20;    private static final int NUM_ACCOUNTS = 5;    private static final int NUM_ITERATIONS = 1000000;    public static void main(String[] args) {        final Random rdn = new Random();        final Account[] accounts = new Account[NUM_ACCOUNTS];        for(int i=0;i

  (4)解析:

上述程序容易形成死锁,原因在于多账户调用TransMoney.transferMoney时,存在锁顺序冲突,

解决方案是使用System.identityHashCode来定义锁的顺序,消除死锁的可能性,代码实现如下:

public static void transferMoney(final Account fromAccount,final Account toAccount,final long amount){    class Helper{        public void transfer(){            fromAccount.debit(amount);            toAccount.credit(amount);        }    }    int fromHash = System.identityHashCode(fromAccount);    int toHash = System.identityHashCode(toAccount);    if(fromHash < toHash){        synchronized (fromAccount){            synchronized (toAccount){                new Helper().transfer();            }        }    }else if(fromHash > toHash){        synchronized (toAccount){            synchronized (fromAccount){                new Helper().transfer();            }        }    }else{        synchronized (tieLock){            synchronized (fromAccount){                synchronized (toAccount){                    new Helper().transfer();                }            }        }    }}

 

转载于:https://www.cnblogs.com/hunterCecil/p/6189171.html

你可能感兴趣的文章
在PADS中如何导出PCB封装库
查看>>
《设计模式之禅》学习笔记(十)
查看>>
160. Intersection of Two Linked Lists
查看>>
深入浅出 Java Concurrency (36): 线程池 part 9 并发操作异常体系[转]
查看>>
面试内容
查看>>
最小公倍数
查看>>
大数乘大数
查看>>
C++继承与派生(原理归纳)
查看>>
PO与PR之间的关系SQL
查看>>
String、StringBuffer和StringBuilder的区别
查看>>
php实现:当未登录时转到登陆页面
查看>>
postgresql安装,java简单使用postgresql
查看>>
UIResponder学习
查看>>
redis 主从服务器
查看>>
设计模式完结(6)--适配器模式----不兼容结构的协调
查看>>
关于Aspose强大的应用--EXECL
查看>>
课堂final发布
查看>>
解锁scott用户
查看>>
多态的理解
查看>>
AspNet Core 发布到Linux系统和发布IIS 注意项
查看>>