java 转账 锁_Java多线程 多个人转账发生死锁
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多線程 多個人轉賬發生死鎖相關教程
總結
以上是生活随笔為你收集整理的java 转账 锁_Java多线程 多个人转账发生死锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java blockingqueue_J
- 下一篇: java 静态变量 存储_Java学习笔