@[toc]
多个人转账发生死锁
人数多的时候, 依然会发生死锁, 遵循墨菲定律.
虽然人多的时候发生死锁的几率不高, 但是危害大.
此节的代码中, 需要用到上一节的代码, 链接如下.
javaweixin6.blog.csdn.net/article/det…
此节的代码如下 :
定义账户的数组, 用于给不同的账户转账.
并且给每个账户赋初始值的钱为1000.
在TransferThread内部类中继承了Thread类, 重写run方法, 执行NUM_ITERATIONS次数的转账操作. 并且每次转账的收款方 , 转账方,转账金额都是随机的. 在run方法中调用 TransferMoney.transferMoney转账方法
接着开启NUM_THREADS个数(20个数)的线程去执行run方法中的任务
package com.thread.deadlock;
import java.util.Random;
/**
* 类名称:MultiTransferMoney
* 类描述: 多人转账发生死锁demo
*
* @author: https://javaweixin6.blog.csdn.net/
* 创建时间:2020/9/9 7:13
* Version 1.0
*/
public class MultiTransferMoney {
//账户的总数量
private static final int NUM_ACCOUNTS = 500;
//每个账户初始的余额
private static final int NUM_MONEY = 1000;
private static final int NUM_ITERATIONS = 1000000;
private static final int NUM_THREADS = 20;
public static void main(String[] args) {
Random random = new Random();
//定义转账的账户数组
TransferMoney.Account[] accounts = new TransferMoney.Account[NUM_ACCOUNTS];
for (int i = 0; i < accounts.length; i++) {
//给每个账户数组中的元素定初始值
accounts[i] = new TransferMoney.Account(NUM_MONEY);
}
class TransferThread extends Thread {
@Override
public void run() {
//每一个线程都进行随机的转账
for (int i = 0; i < NUM_ITERATIONS; i++) {
//随机获取转账方索引
int fromAccount = random.nextInt(NUM_ACCOUNTS);
//随机的获取收款方
int toAccount = random.nextInt(NUM_ACCOUNTS);
//随机获取转账金额
int amount = random.nextInt(NUM_MONEY);
//执行转账的方法
TransferMoney.transferMoney(accounts[fromAccount],accounts[toAccount],amount);
}
}
}
//开启20个线程进行转账
for (int i = 0; i < NUM_THREADS; i++) {
new TransferThread().start();
}
}
}
运行程序后, 几秒钟之后, 就出现了死锁, 控制台的红色按钮一直亮着, 但也没再打印东西, 说明出现了死锁.
这也就说明了, 即使是用户量多,只要有发生死锁的风险,随着时间的推移, 就会出现死锁. 一旦发生 , 就是造成系统的崩溃, 严重影响了业务.
在业务开发中, 写的程序避免发生死锁,这样才是最可靠的.