多线程同步案例

多线程同步案例利用 Thread 或 Runnable 实现一个多用户的银行取款程序 为了保证多个用户在对同一账户取钱时数据的一致性 可通过定义静态变量和线程同步两种方式实现 要求 1 用户可选择使用的取款方式应包含柜台和 ATM 取款 2 采用将账号的钱数定义为静态变量的方式实现该程序 每次不同的用户取钱后打印账号余额 3 采用线程同步的方式实现该程序 每次不同的用户取钱后打印账号余额 静态变量方法 importjava util Random classDrawMon

利用Thread或Runnable实现一个多用户的银行取款程序。为了保证多个用户在对同一账户取钱时数据的一致性,可通过定义静态变量和线程同步两种方式实现。要求:


静态变量方法

import java.util.Random; class DrawMoney implements Runnable{ 
     private static int deposit = 1000; @Override public void run() { 
     // 设置进行十轮取款 for (int i = 0;i < 10;i++){ 
     try { 
     Thread.sleep(500); } catch (InterruptedException e) { 
     e.printStackTrace(); } if (deposit > 100){ 
     // 随机取款1~100元 int withDrawal = new Random().nextInt(100); // 设置存款数为原存款数减去取款数 synchronized (this) { 
     deposit = deposit - withDrawal; System.out.println("在" + Thread.currentThread().getName() + "取款" + withDrawal + "元,余额为" + deposit + "元。"); } }else { 
     System.out.println("准备在" + Thread.currentThread().getName() + "取款,但是余额不足100元,取款失败。"); } } } } / * @author Laccoliths * @date 2021/11/28 */ public class ThreadStatic { 
     public static void main(String[] args) throws InterruptedException { 
     DrawMoney Money = new DrawMoney(); Thread a = new Thread(Money,"柜台"); Thread b = new Thread(Money,"ATM"); a.start(); b.start(); } } 

运行结果
请添加图片描述


线程同步方法

package MoocPart11_01_01; import java.util.Random; / * 共享属性 */ class resource{ 
      private int deposit; / * 构造方法,初始化存款这个属性 * @param deposit */ public resource(int deposit){ 
      super(); this.deposit = deposit; } / * 构造方法,将存款缺省为1000元 */ public resource(){ 
      // 缺省存款为1000元 deposit = 1000; } / * 设置存款数 * @param deposit */ public void setDeposit(int deposit) { 
      this.deposit = deposit; } / * 获取存款数 * @return deposit */ public int getDeposit() { 
      return deposit; } } / * 取钱类 */ class GetMoney implements Runnable{ 
      private final resource resource; / * 构造方法,传入resource对象 */ public GetMoney(resource resource) { 
      this.resource = resource; } @Override public void run() { 
      // 设置进行十轮取款 for (int i = 0;i < 10;i++){ 
      try { 
      Thread.sleep(500); } catch (InterruptedException e) { 
      e.printStackTrace(); } if (resource.getDeposit() > 100){ 
      // 随机取款1~100元 int withDrawal = new Random().nextInt(100); // 设置存款数为原存款数减去取款数 synchronized (this) { 
      resource.setDeposit(resource.getDeposit() - withDrawal); System.out.println("在" + Thread.currentThread().getName() + "取款" + withDrawal + "元,余额为" + resource.getDeposit() + "元。"); } }else { 
      System.out.println("准备在" + Thread.currentThread().getName() + "取款,但是余额不足100元,取款失败。"); } } } } / * @author Laccoliths * @date 2021/11/27 */ public class ThreadSyn { 
      public static void main(String[] args) throws InterruptedException { 
      resource resource = new resource(); GetMoney getMoney = new GetMoney(resource); Thread a = new Thread(getMoney,"柜台"); Thread b = new Thread(getMoney,"ATM"); a.start(); b.start(); } } 

运行结果
请添加图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205790.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午5:11
下一篇 2026年3月19日 下午5:11


相关推荐

  • method_exists函数

    method_exists函数
    method_exists(mixed$object,string$method_name)—Checksiftheclassmethodexists
    确认$object类中是否存在$method_name的方法。如果存在返回TRUE;如果不存在返回FALSE.

    2022年7月15日
    22
  • 描述编程语言的BNF

    描述编程语言的BNF转 来自维基百科 BNF 规定是推导规则 产生式 的集合 写为 lt 符号 gt lt 使用符号的表达式 gt 这里的 lt 符号 gt 是非终结符 而表达式由一个符号序列 或用指示选择的竖杠 分隔的多个符号序列构成 每个符号序列整体都是左端的符号的一种可能的替代 从未在左端出现的符号叫做终结符 基本原理 nbsp nbsp nbsp nbsp nbsp BNF 类似一种数学游戏 从一个符号开始 叫做起始标志 实例

    2026年3月19日
    2
  • 2025最全n8n+Claude MCP实用指南:5步打造AI工作流自动化【实战教程】

    2025最全n8n+Claude MCP实用指南:5步打造AI工作流自动化【实战教程】

    2026年3月16日
    4
  • ubuntu 安装 windows 字体 美化

    ubuntu 安装 windows 字体 美化

    2021年4月29日
    147
  • 门面模式详解

    门面模式详解门面模式门面模式 FacadePatter 又叫外观模式 提供了一个统一的接口 提供了一个统一的接口 用来访问子系统中的一群接口 其主要特征是定义了一个高层接口 让子系统更容易使用 属于结构性模式 其实 在我们日常的编码过程中 我们都在有意无意地大量使用门面模式 但凡只要高层模块需要调度多个子系统 2 个以上类对象 我们都会自觉地创建一个新类封装这些子系统 提供精密接口 让高层模块可以更加容易简介调用这些子系统的功能 尤其是现阶段各种第三方 SDK 各种块原类库 很大概率都会使用门面模式 尤其是你觉得

    2026年3月17日
    2
  • @JSONField 注解详解和应用

    @JSONField 注解详解和应用讲到 JSONField 注解 就不得不提到 Alibaba 开源的 fasejsonfast 是目前 java 语言中最快的 json 库 比自称最快的 jackson 速度要快 第三方独立测试结果看这里 https github com eishay jvm serializers wiki 这里有 jackson 作者 cowtowncoder 等人对 fastjson 的性能评价 https grou

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号