java 转账 锁-ag凯发k8国际
java多线程 多个人转账发生死锁
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多线程 多个人转账发生死锁相关教程
总结
以上是ag凯发k8国际为你收集整理的java 转账 锁_java多线程 多个人转账发生死锁的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: java blockingqueue_j
- 下一篇: java 静态变量 存储_java学习笔