我正在尝试多线程银行转账问题。但是,我遇到了正确同步线程的问题。定期在线程执行账户之间的转账后,它将进行测试以确保没有钱获得或完全损失。Java多线程银行转账,同步问题

当一个线程进入测试方法时,它应该设置一个标志,以防止任何其他线程进入传输方法,然后等待所有当前正在执行的线程传输结束。

public void transfer(int from, int to, int amount) {

//finish running all threads' current transactions before test

accounts[from].waitForAvailableFunds(amount);

if (!open) return;

//checks to see if any thread is currently testing

//if so, wait

while(flag) {

try {

wait();

} catch (InterruptedException e) { /*ignore*/ }

}

//do not execute these two statements when a thread

//is performing a test

if (accounts[from].withdraw(amount)) {

accounts[to].deposit(amount);

}

if (shouldTest() && !flag) test();

}

//only one thread can perform a test at any given moment

public synchronized void test() {

//when test starts set a flag telling threads to

//not begin any new transfers

flag = true;

//wait for all threads currently performing transfers

//to finish current transfer before continuing

int sum = 0;

for (int i = 0; i < accounts.length; i++) {

System.out.printf("%s %s%n",

Thread.currentThread().toString(),accounts[i].toString());

sum += accounts[i].getBalance();

}

System.out.println(Thread.currentThread().toString() +

" Sum: " + sum);

if (sum != numAccounts * initialBalance) {

System.out.println(Thread.currentThread().toString() +

" Money was gained or lost");

System.exit(1);

} else {

System.out.println(Thread.currentThread().toString() +

" The bank is in balance");

}

//reset flag and notify threads test is complete.

flag = false;

notifyAll();

}

首先,我甚至不积极我已经设置了标志并正确等待。其次,如何让进入测试方法的线程等待所有其他正在执行传输的线程完成当前传输。

感谢

银行转账JAVA异常_Java多线程银行转账,同步问题相关推荐

  1. java登录时启动后台异步线程_JAVA多线程的同步和 异步

    原标题:JAVA多线程的同步和 异步 1.多线程和异步操作的异同 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为多线程和异步操作是等同的概念.但是 ...

  2. java 高效的多线程同步_java多线程的同步和异步

    java多线程的同步和异步 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算 ...

  3. 开课吧Java课堂:多线程如何同步?消息如何传递?

    同步性 因为多线程在你的程序中引入了一个异步行为,所以在你需要的时候必须有加强同步性的方法.举例来说,如果你希望两个线程相互通信并共享一个复杂的数据结构,例如链表序列,你需要某些方法来确保它们没有相互 ...

  4. java 异常_Java 进阶之异常处理

    本文的主要内容分为 Java 异常的定义.Java 异常的处理.JVM 基础知识(异常表.JVM 指令分类和操作数栈)及深入剖析 try-catch-finally 四部分(图解形式).在深入剖析 t ...

  5. java异常_Java的异常体系

    保证程序的健壮性 java异常体系 error:比如栈内存溢出(StackOverError) Exception这种异常又分为两类:运行时异常和编译异常. 1.运行时异常(逻辑异常):代码不规范引起 ...

  6. java同步与死锁_Java多线程 - 线程同步与死锁

    一.线程同步 1)模拟多个用户同时从银行账户里面取钱 ● Account 类:银行账户类,里面有一些账户的基本信息,以及操作账户信息的方法 //模拟银行账户 classAccount {private ...

  7. java 多线程异常_java多线程执行异常

    循环次数只有十次,执行的速度太快了,几乎可以忽略不计了,这正好说明了主线程直接先执行,然后Thread启动了run方法其次执行的道理,如果你想看到更真实的效果我建议你在线程中添加延迟,这样可以看的更加 ...

  8. java 多线程的同步问题_java多线程解决同步问题的几种方式,原理和代码

    wait()/notify()方法 await()/signal()方法 BlockingQueue阻塞队列方法 PipedInputStream/PipedOutputStream 阻塞队列的一个简 ...

  9. java厨房_Java多线程基础

    目录: 进程和线程 为什么使用多线程? 多线程的创建方式 Runnable与Thread两种方式比较 start()与run()方法 线程的生命周期/状态转换 常用方法使用与解读 线程的优先级 守护线 ...

  10. java丐帮_java多线程学习笔记(二)

    上一节讲到多线程的创建,两种创建方式一种继承Thread类,一种实现Runnable接口: 常用的多线程函数: currentThread()方法        返回代码段正在被哪个线程调用的信息 i ...

最新文章

  1. python【蓝桥杯vip练习题库】ADV-303 数组求和
  2. mysql DML操作、关联查询、联合查询、聚合函数使用
  3. python input()与raw_input()
  4. 学习spring之前必学之反射技术(IOC)(一)
  5. 2.0版本中如何取得当前的控制器和方法
  6. 大屏监控系统实战(7)-后端整合MybatisPlus并暴露服务
  7. 自动化测试和测试开发的区别?培训学哪个更好?
  8. 061 实例15-霍兰德人格分析雷达图
  9. 实力推荐:现网全能屏幕录像和编辑的软件
  10. 刘宝瑞相声《珍珠翡翠白玉汤》台词
  11. Robocup3D优化任务布置
  12. sqlserver2008使用设置sa用户登录步骤
  13. IOI 2022 简要题解
  14. 2019-11-29-win10-UWP-Controls-by-function
  15. 个人使用华为云服务器的经验分享
  16. EDG的夺冠之路充满荆棘,电子竞技又何尝不是?
  17. 人工智能在教育行业的应用
  18. 0.618方法matlab流程图,0.618法的matlab实现
  19. 4Ps营销理论(The Marketing Theory of 4Ps)
  20. 现在当兵有什么待遇复原以后_大学生当兵有什么好处 退伍后待遇怎么样

热门文章

  1. mcal rtm_RTM的完整形式是什么?
  2. exec还原oracle,详解通过Backup Exec来实施Oracle灾难恢复
  3. 1660用哪个驱动稳定_安装驱动软件我认为哪个最好?
  4. org.apache.commons.fileupload.DiskFileUpload1
  5. 高斯模型MATLAB的实现,高斯混合模型GMM实现matlab
  6. 电脑硬件知识扫盲 菜鸟提升必看电脑配置知识
  7. C3P0连接池的配置方式
  8. java 微博 屏蔽_最新JAVA调用新浪微博API之发微博(转)
  9. 笨方法学python第二版_笨方法学python II
  10. Java高端培训蚂蚁课堂(每特学院)系列项目实战