Java多线程 多个人转账发生死锁

文章目录

      • 多个人转账发生死锁

多个人转账发生死锁

人数多的时候, 依然会发生死锁, 遵循墨菲定律.
虽然人多的时候发生死锁的几率不高, 但是危害大.
此节的代码中, 需要用到上一节的代码, 链接如下.
https://javaweixin6.blog.csdn.net/article/details/108475207

此节的代码如下 :
定义账户的数组, 用于给不同的账户转账.
并且给每个账户赋初始值的钱为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();
        }
    }
}

运行程序后, 几秒钟之后, 就出现了死锁, 控制台的红色按钮一直亮着, 但也没再打印东西, 说明出现了死锁.
这也就说明了, 即使是用户量多,只要有发生死锁的风险,随着时间的推移, 就会出现死锁. 一旦发生 , 就是造成系统的崩溃, 严重影响了业务.
在业务开发中, 写的程序避免发生死锁,这样才是最可靠的.
Java多线程 多个人转账发生死锁_第1张图片

你可能感兴趣的:(Java多线程基础与核心)