Java多线程同步---------银行取存款实例 青旅半醒 2022-05-12 08:10 210阅读 0赞 转载: [https://blog.csdn.net/wenwen091100304/article/details/48318699][https_blog.csdn.net_wenwen091100304_article_details_48318699] ## 1.不同步时的代码: ## Bank类: package com; public class Bank { private int count=0; //存钱 public void addMoney(int money) { count+=money; System.out.println("成功存进银行"+money+"元"); } public void subMoney(int money) { if(count>=money) { count-=money; System.out.println("成功取出"+money+"元"); }else { System.out.println("余额不足"); } } public void lookMoney() { System.out.println("账户余额:"+count); } } 测试类: package com; public class BankTest { public static void main(String[] args) { final Bank bank=new Bank(); Thread tadd=new Thread(new Runnable() { public void run() { while(true) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } bank.addMoney(100); bank.lookMoney(); System.out.println("\n"); } } }); Thread tsub=new Thread(new Runnable() { public void run() { while(true) { bank.subMoney(100); bank.lookMoney(); System.out.println("\n"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }); tsub.start(); tadd.start(); } } 运行结果: 余额不足 账户余额:0 成功存进银行100元 账户余额:100 成功取出100元 账户余额:0 余额不足 账户余额:0 成功存进银行100元 账户余额:100 成功存进银行100元 成功取出100元 账户余额:100 账户余额:100 成功存进银行100元 成功取出100元 账户余额:100 账户余额:100 成功存进银行100元 成功取出100元 账户余额:100 账户余额:100 ## 2.同步时的代码: ## ### **第一种:** ### ### **synchronized** 关键字修饰**方法**: ### 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。**在调用该方法前,需要获得内置锁,否则就处于阻塞状态。** package com; public class Bank { private int count=0; //存钱 public synchronized void addMoney(int money) { count+=money; System.out.println("成功存进银行"+money+"元"); } public synchronized void subMoney(int money) { if(count>=money) { count-=money; System.out.println("成功取出"+money+"元"); }else { System.out.println("余额不足"); } } public void lookMoney() { System.out.println("账户余额:"+count); } } 运行结果: 余额不足 账户余额:0 余额不足 账户余额:0 成功存进银行100元 账户余额:100 成功存进银行100元 账户余额:100 成功取出100元 账户余额:100 成功取出100元 账户余额:0 成功存进银行100元 账户余额:100 成功存进银行100元 账户余额:100 成功取出100元 账户余额:100 成功存进银行100元 账户余额:200 成功取出100元 账户余额:100 成功取出100元 账户余额:0 成功存进银行100元 账户余额:100 成功取出100元 账户余额:0 成功存进银行100元 账户余额:100 成功存进银行100元 成功取出100元 账户余额:100 账户余额:100 **注意:** ** synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类 ** ### 第二种: ### ### **synchronized**关键字同步代码块: ### package com; public class Bank { private int count=0; //存钱 public void addMoney(int money) { synchronized(this) { count+=money; } System.out.println("成功存进银行"+money+"元"); } public void subMoney(int money) { synchronized(this) { if(count>=money) { count-=money; System.out.println("成功取出"+money+"元"); }else { System.out.println("余额不足"); } } } public void lookMoney() { System.out.println("账户余额:"+count); } } 余额不足 账户余额:0 成功存进银行100元 账户余额:100 成功取出100元 账户余额:0 成功存进银行100元 成功取出100元 账户余额:0 账户余额:0 成功存进银行100元 账户余额:0 成功取出100元 账户余额:0 ### 3.volatile关键字 ### 它的原理是**每次要线程要访问volatile修饰的变量时都是从内存中读取,而不是从缓存当中读取,因此每个线程访问到的变量值都是一样的。这样就保证了同步。** * volatile关键字为域变量的访问提供了一种免锁机制 * 使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新 * 因此每次使用该域就要重新计算,而不是使用寄存器中的值 * volatile不会提供任何原子操作,它也不能用来修饰final类型的变量 ![70][] 运行结果: 余额不足 账户余额:0 余额不足 成功存进银行100元 账户余额:100 账户余额:100 成功取出100元 账户余额:100 成功存进银行100元 账户余额:100 成功取出100元 账户余额:0 成功存进银行100元 账户余额:100 成功取出100元 成功存进银行100元 账户余额:200 账户余额:200 成功存进银行100元 账户余额:200 成功取出100元 账户余额:200 [https_blog.csdn.net_wenwen091100304_article_details_48318699]: https://blog.csdn.net/wenwen091100304/article/details/48318699 [70]: /images/20220512/690656683e7f458e9b90fb0bf20bee2f.png
相关 线程同步问题:Java多线程场景实例 在Java多线程场景中,常见的线程同步问题是资源竞争和死锁。以下是一个实际的实例来说明这个问题: 1. **场景描述**: - 有多个生产者(Producer)同时向一 Bertha 。/ 2024年10月24日 12:24/ 0 赞/ 25 阅读
相关 多线程同步问题实例 一个常见的多线程同步问题实例是生产者-消费者模型(Producer-Consumer Model)。 1. **问题描述**: - 假设我们有一个生产者(Produce 我就是我/ 2024年09月22日 15:24/ 0 赞/ 75 阅读
相关 多线程同步:Java Thread同步工具实例 在Java中,多线程的同步主要通过以下几种工具或机制实现: 1. synchronized关键字:用于修饰方法或代码块,保证同一时间只有一个线程访问。 ```java pu 本是古典 何须时尚/ 2024年09月19日 13:27/ 0 赞/ 59 阅读
相关 并发编程实例:Java多线程下银行存款操作示例? 在Java中,我们可以使用多线程来模拟银行存款的操作。以下是一个简单的示例: 1. 创建一个`BankAccount`类,用于存储账户信息和执行存款操作。 ```java 超、凢脫俗/ 2024年09月15日 01:09/ 0 赞/ 29 阅读
相关 并发编程中的线程安全问题:银行存款应用实例 银行存款应用是一个典型的并发编程场景,其中存在线程安全问题。以下是具体的实例分析: 1. **共享数据**: 银行账户的余额是多个请求可能需要访问的共享资源。如果多个线程同时 ╰+哭是因爲堅強的太久メ/ 2024年09月11日 21:24/ 0 赞/ 33 阅读
相关 Java多线程同步问题实例 以下是一个典型的Java多线程同步问题实例,我们使用synchronized关键字来实现锁机制。 **问题描述:** 假设有一个银行账户,只有一个存款和取款操作。现在有两个线 蔚落/ 2024年09月06日 00:57/ 0 赞/ 72 阅读
相关 Java多线程同步问题实例 在Java中,多线程的同步问题是通过各种锁机制来解决的。下面我们将通过一个实际的例子来理解。 **例子:生产者-消费者模型** 1. 生产者(Producer)线程负责生成 柔情只为你懂/ 2024年09月06日 00:09/ 0 赞/ 91 阅读
相关 多线程(银行存款)使用notify()和wait()线程通信实现交替存款 /\ \有两个 储户向银行中同一个账户存款,一次1000,各存3次; \使用notify()和wait()线程通信实现交替存款; \/ public 谁借莪1个温暖的怀抱¢/ 2022年08月14日 04:58/ 0 赞/ 147 阅读
相关 Java多线程同步---------银行取存款实例 转载: [https://blog.csdn.net/wenwen091100304/article/details/48318699][https_blog.csdn.ne 青旅半醒/ 2022年05月12日 08:10/ 0 赞/ 211 阅读
还没有评论,来说两句吧...