Java规避线程死锁:允许线程抢占资源 红太狼 2022-11-19 11:23 172阅读 0赞 测试用储户实体类: package domain; import java.util.ArrayList; /** * 规避死锁问题的共享存取实体类 * * @author WanAkiko * */ public class Depositor { private String account; private Double balance; private ArrayList<Depositor> list = new ArrayList<Depositor>(); public Depositor() { super(); } public Depositor(String account, Double balance) { super(); this.account = account; this.balance = balance; } /** * 资金收入 */ public void earning(Double money) { this.balance += money; } /** * 资金支出 */ public void expenditure(Double money) { this.balance -= money; } /** * 资源上锁 * * @param depThis * @param depThat * @return */ public synchronized boolean resourceLocked(Depositor depThis, Depositor depThat) { // 若对象序列中存在任意携锁对象则无需继续上锁 if (list.contains(depThis) || list.contains(depThat) || list.size() > 0) { return false; } list.add(depThis); list.add(depThat); return true; } /** * 资源释放 * * @param depThis * @param depThat */ public synchronized void resourceRelease(Depositor depThis, Depositor depThat) { list.remove(depThis); list.remove(depThat); } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public Double getBalance() { return balance; } public void setBalance(Double balance) { this.balance = balance; } @Override public String toString() { return "Depositor [account=" + account + ", balance=" + balance + "]"; } } 转账线程: package domain; /** * 转账线程(允许线程抢占资源) * * @author WanAkiko * */ public class AllowsPreemptThread implements Runnable { private Depositor incomeObject; // 收入对象 private Depositor spendingObject; // 支出对象 private Double money = 0.0; // 交易金额 /** * 转账线程全参构造 * * @param incomeObject * @param spendingObject * @param money */ public AllowsPreemptThread(Depositor incomeObject, Depositor spendingObject, Double money) { super(); this.incomeObject = incomeObject; this.spendingObject = spendingObject; this.money = money; } @Override public void run() { Depositor depositor = new Depositor(); while (true) { try { // 为未携带锁的对象扣上资源锁 if (depositor.resourceLocked(incomeObject, spendingObject)) { // 收入对象的余额大于或等于目标金额时 if (spendingObject.getBalance() >= money) { spendingObject.expenditure(money); // 资金支出 incomeObject.earning(money); // 资金收入 System.out.println("出账用户-" + spendingObject.getAccount() + ",剩余余额:" + spendingObject.getBalance() + "¥;进账用户:" + incomeObject.getAccount() + ",当前余额:" + incomeObject.getBalance() + "¥"); } } } finally { depositor.resourceRelease(incomeObject, spendingObject); } } } } 死锁规避测试: package test; import domain.Depositor; import domain.StopLoopWaitThread; /** * 规避线程死锁(允许线程抢占资源) * * @author WanAkiko * */ public class ResourcePreemptTest { public static void main(String[] args) { Depositor incomeObject = new Depositor("WanAkiko", 1000.0); Depositor spendingObject = new Depositor("WanQuee", 2000.0); new Thread(new StopLoopWaitThread(incomeObject, spendingObject, 2.0)).start(); new Thread(new StopLoopWaitThread(incomeObject, spendingObject, 5.0)).start(); } } 运行示例: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0OTY1Mzkz_size_16_color_FFFFFF_t_70] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0OTY1Mzkz_size_16_color_FFFFFF_t_70]: /images/20221119/7437975e34a047ac96c6e7172a75263e.png
相关 JAVA多线程—线程死锁 程死锁: 创建两个字符串a和b,再创建两个线程A和B,让每个线程都用synchronized锁住字符串(A先锁a,再去锁b;B先锁b,再锁a),如果A锁住a,B锁住b,... 妖狐艹你老母/ 2024年04月17日 22:29/ 0 赞/ 122 阅读
相关 Java规避线程死锁:终止线程循环等待 测试用储户实体类: package domain; import java.util.ArrayList; / 规避死 短命女/ 2022年11月19日 11:23/ 0 赞/ 189 阅读
相关 Java规避线程死锁:允许线程抢占资源 测试用储户实体类: package domain; import java.util.ArrayList; / 规避死 红太狼/ 2022年11月19日 11:23/ 0 赞/ 173 阅读
相关 Java线程死锁 /\ \ 【线程死锁】 \ 原因:两个线程相互等待被对方锁定的资源 \/ 代码模拟: public class DeadLock { 骑猪看日落/ 2022年09月26日 02:18/ 0 赞/ 277 阅读
相关 线程死锁 线程死锁是多线程中最头疼的问题,一旦进入线程死锁,很多时候只能通过外部进程重启才能解决问题 线程到达死锁的四个条件: 互斥条件:一个资源每次只能被一个线程使用 资源独占条 港控/mmm°/ 2022年08月21日 14:43/ 0 赞/ 232 阅读
相关 线程死锁 简述: 星期一,新的的一周开始,天气晴朗,风和日丽。本是一个非常不错的心情,突然微信头像闪烁,果不其然又爬虫出问题了,可谓是一入爬虫深似海,项目稳定才见鬼。 墨蓝/ 2022年06月08日 06:30/ 0 赞/ 288 阅读
相关 Java——线程死锁 //要避免死锁 //死锁的例子 /class Ticket implements Runnable{ private int 我就是我/ 2022年06月07日 03:51/ 0 赞/ 292 阅读
相关 Java线程死锁 需要避免的与多任务处理有关的特殊错误类型是死锁(deadlock)。死锁发生在当两个线程对一对同步对象有循环依赖关系时。例如,假定一个线程进入了对象X的管程而另一个线程进入了对 悠悠/ 2022年05月20日 00:14/ 0 赞/ 296 阅读
相关 线程死锁 先简单用生活列子介绍死锁, 2个人一起吃饭但是只有一双筷子,2人轮流吃(同时拥有2只筷子才能吃)。某一个时候,一个拿了左筷子,一人拿了右筷子,2个人都 ╰半夏微凉°/ 2022年04月08日 13:00/ 0 赞/ 307 阅读
相关 线程死锁 ![20190811092629898.png][] package com.vince; / 多线程要进行资源的共享,就需要同步,但同步过多,就 ゞ 浴缸里的玫瑰/ 2021年10月18日 09:36/ 0 赞/ 465 阅读
还没有评论,来说两句吧...