Java规避线程死锁:允许线程抢占资源 红太狼 2022-11-19 11:23 124阅读 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规避线程死锁:终止线程循环等待 测试用储户实体类: package domain; import java.util.ArrayList; / 规避死 短命女/ 2022年11月19日 11:23/ 0 赞/ 120 阅读
相关 Java规避线程死锁:允许线程抢占资源 测试用储户实体类: package domain; import java.util.ArrayList; / 规避死 红太狼/ 2022年11月19日 11:23/ 0 赞/ 125 阅读
相关 Java线程死锁 /\ \ 【线程死锁】 \ 原因:两个线程相互等待被对方锁定的资源 \/ 代码模拟: public class DeadLock { 骑猪看日落/ 2022年09月26日 02:18/ 0 赞/ 203 阅读
相关 线程死锁 一、死锁概念 线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便 一时失言乱红尘/ 2022年06月14日 09:12/ 0 赞/ 203 阅读
相关 Java——线程死锁 //要避免死锁 //死锁的例子 /class Ticket implements Runnable{ private int 我就是我/ 2022年06月07日 03:51/ 0 赞/ 210 阅读
相关 Java线程死锁 需要避免的与多任务处理有关的特殊错误类型是死锁(deadlock)。死锁发生在当两个线程对一对同步对象有循环依赖关系时。例如,假定一个线程进入了对象X的管程而另一个线程进入了对 悠悠/ 2022年05月20日 00:14/ 0 赞/ 221 阅读
相关 Java 多线程二:线程死锁 什么是线程的死锁?通俗点来说,不同线程等待对方先释放,互不释放资源,造成程序无法继续执行。 如下面一段程序: public class TestLock \{ 电玩女神/ 2022年05月17日 22:11/ 0 赞/ 261 阅读
相关 线程死锁 虽然同步锁机制解决了线程安全问题,但是也带来一些弊端: 1. 效率会降低,每次都需要判断锁的状态 2. 可能引发死锁(彼此占用所需要的资源),出现的概率非常小, 叁歲伎倆/ 2022年05月08日 02:38/ 0 赞/ 203 阅读
相关 线程死锁 先简单用生活列子介绍死锁, 2个人一起吃饭但是只有一双筷子,2人轮流吃(同时拥有2只筷子才能吃)。某一个时候,一个拿了左筷子,一人拿了右筷子,2个人都 ╰半夏微凉°/ 2022年04月08日 13:00/ 0 赞/ 228 阅读
相关 线程死锁 ![20190811092629898.png][] package com.vince; / 多线程要进行资源的共享,就需要同步,但同步过多,就 ゞ 浴缸里的玫瑰/ 2021年10月18日 09:36/ 0 赞/ 381 阅读
还没有评论,来说两句吧...