java多线程同步示例,来自《疯狂java讲义》。通过synchronized,wait(),notify(),notifyAll()实现多线程同步与通信。假设现在系统中有两个线程,这两个线程分别代表存钱者和取钱者---现在假设系统有一种特殊的要求,系统要求存款者和取钱者不断地重复存钱、取钱动作,而且要求每当存款着将钱存入指定账户后,取钱者就立即取出这笔钱。不允许存款者连续两次存钱,也不允许取钱者连续两次取钱。程序中,通过一个旗标flag标识,本次账户操作是不是存款操作,以便下次操作可以探测。可类比:http://www.oschina.net/code/snippet_820500_44795

1.[代码]Account账户类,有取钱(drawBalance)和存钱(deposit)两个同步方法

package com.sunchp;

public class Account {

private String accountNo;

private double balance;

private boolean flag = false;

public Account(String _accountNo, double _balance) {

this.accountNo = _accountNo;

this.balance = _balance;

}

public String getAccountNo() {

return accountNo;

}

public void setAccountNo(String accountNo) {

this.accountNo = accountNo;

}

public double getBalance() {

return balance;

}

public synchronized void drawBalance(double drawBalance) {

if (flag) {

if (balance > drawBalance) {

System.out.println(Thread.currentThread().getName() + "取钱成功,正在吐钞:" + drawBalance);

balance -= drawBalance;

flag = false;

this.notifyAll();

System.out.println(Thread.currentThread().getName() + "余额为:" + getBalance());

} else {

System.out.println(Thread.currentThread().getName() + "取钱失败,余额不足");

}

} else {

try {

wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

public synchronized void deposit(double depositBalance) {

if (flag) {

try {

wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

} else {

System.out.println(Thread.currentThread().getName() + " 存款:" + depositBalance);

this.balance += depositBalance;

flag = true;

this.notifyAll();

System.out.println(Thread.currentThread().getName() + "余额为:" + getBalance());

}

}

}

2.[代码]取钱线程类

package com.sunchp;

public class MyThread1 implements Runnable {

private Account account;

private double drawBalance;

public Account getAccount() {

return account;

}

public void setAccount(Account account) {

this.account = account;

}

public double getDrawBalance() {

return drawBalance;

}

public void setDrawBalance(double drawBalance) {

this.drawBalance = drawBalance;

}

@Override

public void run() {

for (int i = 0; i < 100; i++) {

account.drawBalance(drawBalance);

}

}

}

3.[代码]存钱线程类

package com.sunchp;

public class MyThread2 implements Runnable {

private Account account;

private double depositBalance;

public Account getAccount() {

return account;

}

public void setAccount(Account account) {

this.account = account;

}

public double getDepositBalance() {

return depositBalance;

}

public void setDepositBalance(double depositBalance) {

this.depositBalance = depositBalance;

}

@Override

public void run() {

for (int i = 0; i < 100; i++) {

account.deposit(depositBalance);

}

}

}

4.[代码]测试类,main方法

package com.sunchp;

public class Test {

public static void main(String[] args) throws Exception {

Account acc = new Account("001", 1000);

MyThread1 mt1 = new MyThread1();

mt1.setAccount(acc);

mt1.setDrawBalance(20);

Thread t1 = new Thread(mt1, "取钱者1");

Thread t2 = new Thread(mt1, "取钱者2");

MyThread2 mt2 = new MyThread2();

mt2.setAccount(acc);

mt2.setDepositBalance(20);

Thread t3 = new Thread(mt2, "存钱者1");

Thread t4 = new Thread(mt2, "存钱者2");

t1.start();

t2.start();

t3.start();

t4.start();

}

}

java同步通信方式_java多线程同步与通信示例(synchronized方式)相关推荐

  1. java 多线程同步问题_Java多线程同步问题:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.一个简单的Demo引发的血案 关于线程同步问题我们从一个 ...

  2. java 同步锁_Java多线程:synchronized同步锁的使用和实现原理

    作用和用法 在多线程对共享资源进行并发访问方面,JDK提供了synchronized关键字来进行线程同步,实现多线程并发访问的线程安全.synchronized的作用主要体现在三个方面:(1)确保线程 ...

  3. java synchronized块_Java多线程同步代码块Synchronized

    Java多线程同步代码块Synchronized Java中的每个对象都有一个与之关联的内部锁(Intrinsic lock). 这种锁也称为监视器(Monitor), 这种内部锁是一种排他锁,可以保 ...

  4. java 管程通信_Java多线程07_线程通信之管程法与信号灯法

    Java多线程07_线程通信之管程法与信号灯法 线程通信 的应用场景是 消费者/生产者问题: 解决线程通信的方法: wait()表示线程一直等待,直到接到通知(会释放锁) wait(long time ...

  5. java多线程同步异步_003JAVA多线程同步与异步方法

    003JAVA多线程同步与异步方法 发布时间:2020-04-03 09:51:20 来源:51CTO 阅读:314 作者:zjy1002261870 package com.skcc.mthread ...

  6. java线程钥匙_Java多线程并发编程/锁的理解

    一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...

  7. 线程同步锁 java_java多线程同步之重入锁,详细解析

    上次已经为大家介绍过java多线程同步,Volatile详解的主要内容了.今天再来为大家介绍一些相关的内容,也就是java多线程同步之重入锁,一起来了解一下吧. 使用重入锁实现线程同步 在JavaSE ...

  8. java线程栅栏_Java 多线程基础 - CyclicBarrier

    我的博客 转载请注明原创出处. 序 java.util.concurrent包里有几个能帮助人们管理相互合作的线程集的类,为多线程常见的应用场景预置了抽象好的类库.在遇到这些应用场景时应该直接重用合适 ...

  9. java线程池_Java多线程并发:线程基本方法+线程池原理+阻塞队列原理技术分享...

    线程基本方法有哪些? 线程相关的基本方法有 wait,notify,notifyAll,sleep,join,yield 等. 线程等待(wait) 调用该方法的线程进入 WAITING 状态,只有等 ...

最新文章

  1. html链接伪类设置鼠标悬停,链接伪类可以控制超链接的样式吗?是怎样实现的?...
  2. Java虚拟机性能监控工具草览
  3. 你知道R中的赋值符号箭头(-)和等号(=)的区别吗?
  4. linux运行脚本文件python,Python脚本:Linux自动化执行Python脚本
  5. 一文整理IEEE问题汇总【IEEE PDF Checker】(更新中)
  6. codeforces Labyrinth
  7. 大型Lambda的C# 泊松累积分布
  8. HDU 5666 Segment 数论+大数
  9. 如何在 macOS 上禁用 Adob​​e 后台进程,保存 CPU、内存和网络活动?
  10. 用波尔理论推导里德伯公式
  11. python学习--max和reduce函数
  12. rgret白鹭 开发html游戏,白鹭推HTML5首款生态产品Egret Runtime
  13. 初学单片机:Proteus 8 和 keil 4的使用方法(Proteus 8 和 keil 4建立一个项目/文件)
  14. 事务的隔离级别(附Redis的简述)
  15. java:计算自由落体运动中物体的位移
  16. 如何正确运用过去完成时
  17. c:\Windows\system32\ regsvr32.exe Windows无法访问指定设备、路径或文件,你可能没有适当的权限访问该项目
  18. layui ajax初始化,layui-滑块验证的动态修改及初始化
  19. docker 在线安装
  20. [SIM]MT6572在研发过程中,突然不识别SIM2

热门文章

  1. 企业的核心竞争力是什么
  2. 最好用的硬盘搜索工具--Ava find pro
  3. 一起学习 网络规划设计师
  4. WinForm 2.0 textBox作为参数的查询,显示在DataGridView
  5. Python的matplotlib—绘图(3)
  6. 使用timer定时器,防止事件重入
  7. JS中document和window的区别
  8. 简单易用的.NET免费开源RabbitMQ操作组件EasyNetQ解析
  9. java整合apollo(一)
  10. 创建WebSocket服务器