1.需求:
//        小明和小红是一对夫妻,他们有一个共同的账户,余额是10万元,模拟2人同时去取钱10万。
//        分析:
//        1:需要提供一个账户类,创建一个账户对象代表2个人的共享账户。
//        2:需要定义一个线程类,线程类可以处理账户对象。
//        3:创建2个线程对象,传入同一个账户对象。
//        4:启动2个线程,去同一个账户对象中取钱10万。

目录

一.同步代码块

二.同步方法

三.lock锁


一.同步代码块

public class Account {private String cardId;private double money; // 余额 关键信息public Account() {}public Account(String cardId, double money) {this.cardId = cardId;this.money = money;}public String getCardId() {return cardId;}public void setCardId(String cardId) {this.cardId = cardId;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}//    // 100个线程人
//    public static void run(){
//        synchronized (Account.class){
//
//        }
//    }/**小明 小红*/public void drawMoney(double money) {// 1、拿到是谁来取钱String name = Thread.currentThread().getName();// 同步代码块// 小明 小红// this == acc 共享账户synchronized (this) {// 2、判断余额是否足够if(this.money >= money){// 钱够了System.out.println(name+"来取钱,吐出:" + money);// 更新余额this.money -= money;System.out.println(name+"取钱后,余额剩余:" + this.money);}else{// 3、余额不足System.out.println(name+"来取钱,余额不足!");}}}
}public class Account {private String cardId;private double money; // 余额 关键信息public Account() {}public Account(String cardId, double money) {this.cardId = cardId;this.money = money;}public String getCardId() {return cardId;}public void setCardId(String cardId) {this.cardId = cardId;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}//    // 100个线程人
//    public static void run(){
//        synchronized (Account.class){
//
//        }
//    }/**小明 小红*/public void drawMoney(double money) {// 1、拿到是谁来取钱String name = Thread.currentThread().getName();// 同步代码块// 小明 小红// this == acc 共享账户synchronized (this) {// 2、判断余额是否足够if(this.money >= money){// 钱够了System.out.println(name+"来取钱,吐出:" + money);// 更新余额this.money -= money;System.out.println(name+"取钱后,余额剩余:" + this.money);}else{// 3、余额不足System.out.println(name+"来取钱,余额不足!");}}}
}

public class DrawThread extends Thread{private Account acc;public DrawThread(Account acc, String name){super(name);this.acc = acc;}@Overridepublic void run() {// 小明 小红  : accacc.drawMoney(100000);}
}

public class TestSafeDemo {public static void main(String[] args) {// 测试线程安全问题// 1、创建一个共享的账户对象。Account acc = new Account("ICBC-111" , 100000);// 2、创建2个线程对象,操作同一个账户对象new DrawThread(acc, "小明").start();new DrawThread(acc,"小红").start();}
}

二.同步方法

public class Account {private String cardId;private double money; // 余额 关键信息public Account() {}public Account(String cardId, double money) {this.cardId = cardId;this.money = money;}public String getCardId() {return cardId;}public void setCardId(String cardId) {this.cardId = cardId;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}/**小明 小红this == acc*/public synchronized void drawMoney(double money) {// 1、拿到是谁来取钱String name = Thread.currentThread().getName();// 2、判断余额是否足够// 小明  小红if(this.money >= money){// 钱够了System.out.println(name+"来取钱,吐出:" + money);// 更新余额this.money -= money;System.out.println(name+"取钱后,余额剩余:" + this.money);}else{// 3、余额不足System.out.println(name+"来取钱,余额不足!");}}
}
public class DrawThread extends Thread{private Account acc;public DrawThread(Account acc, String name){super(name);this.acc = acc;}@Overridepublic void run() {// 小明 小红  : accacc.drawMoney(100000);}
}
import java.util.*;public class TestSafeDemo {public static void main(String[] args) {// 测试线程安全问题// 1、创建一个共享的账户对象。Account acc = new Account("ICBC-111" , 100000);// 2、创建2个线程对象,操作同一个账户对象new DrawThread(acc, "小明").start();new DrawThread(acc,"小红").start();}
}

三.lock锁

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/**账户类:余额 , 卡号。*/
public class Account {private String cardId;private double money; // 余额 关键信息// final修饰后:锁对象是唯一和不可替换的,非常专业private final Lock lock = new ReentrantLock();public Account() {}public Account(String cardId, double money) {this.cardId = cardId;this.money = money;}public String getCardId() {return cardId;}public void setCardId(String cardId) {this.cardId = cardId;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}/**小明 小红*/public void drawMoney(double money) {// 1、拿到是谁来取钱String name = Thread.currentThread().getName();// 2、判断余额是否足够// 小明  小红lock.lock(); // 上锁try {if(this.money >= money){// 钱够了System.out.println(name+"来取钱,吐出:" + money);// 更新余额this.money -= money;System.out.println(name+"取钱后,余额剩余:" + this.money);}else{// 3、余额不足System.out.println(name+"来取钱,余额不足!");}} finally {lock.unlock(); // 解锁}}
}
public class DrawThread extends Thread{private Account acc;public DrawThread(Account acc, String name){super(name);this.acc = acc;}@Overridepublic void run() {// 小明 小红  : accacc.drawMoney(100000);}
}
public class TestSafeDemo {public static void main(String[] args) {// 测试线程安全问题// 1、创建一个共享的账户对象。Account acc = new Account("ICBC-111" , 100000);// 2、创建2个线程对象,操作同一个账户对象new DrawThread(acc, "小明").start();new DrawThread(acc,"小红").start();}
}

Java多线程练习--取钱相关推荐

  1. JAVA多线程----用--取钱问题1

    "生产者-消费者"模型,也就是生产者线程只负责生产,消费者线程只负责消费,在消费者发现无内容可消费时则睡觉.下面举一个比较实际的例子--生活费问题. 生 活费问题是这样的:学生每月 ...

  2. java多线程银行取钱_用java线程同步实现银行取款和存款。

    题目是:编写程序实现线程的同步.假设一个银行的ATM机,它可以允许用户存款也可以取款.现在一个账户上有200元,用户A和用户B都拥有在这个账户上存款和取款的权利.用户A将存入100元... 题目是:编 ...

  3. 学校铃声Java_java_java多线程抓取铃声多多官网的铃声数据,一直想练习下java多线程抓取数 - phpStudy...

    java多线程抓取铃声多多官网的铃声数据 一直想练习下java多线程抓取数据. 有天被我发现,铃声多多的官网(http://www.shoujiduoduo.com/main/)有大量的数据. 通过观 ...

  4. JAVA取钱多线程实验_JAVA多线程----用--取钱问题2

    在该示例代码中,TestAccount类是测试类,主要实现创建帐户Account类的对象,以及启动学生线程StudentThread和启动家长线程GenearchThread.在StudentThre ...

  5. Java多线程爬取豆瓣排行榜Top250(maven)

    总体设计 分析网页 确定需要用到的jar包,并通过pom.xml进行配置 创建一个电影实体类(Film),写入要爬取电影的相关属性,并用set和get方法封装 编写一个多线程爬取Top250的电影程序 ...

  6. java 多线程爬取网页,利用jsoup爬取百度网盘资源分享连接(多线程)

    突然有一天就想说能不能用某种方法把百度网盘上分享的资源连接抓取下来,于是就动手了.知乎上有人说过最好的方法就是http://pan.baidu.com/wap抓取,一看果然链接后面的uk值是一串数字, ...

  7. java 爬取图片_使用Java多线程爬取网站图片

    使用Java爬取网站的图片并保存至本地 使用maven导入依赖org.jsoup jsoup 1.11.2 实现代码:import org.jsoup.HttpStatusException; imp ...

  8. java多线程爬取养眼福利图片(懂得都懂,带注释)

    上次做了个python版的福利爬虫,不过咱主业还是java,所以再发个java版本的,附带每一步的注释,又看不懂的地方欢迎提问首先导入jar包,我这里用的maven,没有maven的可以自己在网上下载 ...

  9. java铃声类_java多线程抓取铃声多多官网的铃声数据

    一直想练习下java多线程抓取数据. 有天被我发现,铃声多多的官网(http://www.shoujiduoduo.com/main/)有大量的数据. 通过观察他们前端获取铃声数据的ajax http ...

最新文章

  1. c语言合法常量2.57e03,[单选] 目前杭州共有世界遗产()项。
  2. 数据库路由中间件MyCat - 使用篇(2)
  3. org.springframework.beans.factory.BeanCreationException:
  4. erlang md5
  5. 混合编程黑科技:跨语言编程问题迎刃而解的3个要点
  6. 主机overlay和网络overlay_Docker网络篇之overlay模式
  7. C# 3.0 New Language Features (Part 2)
  8. c大小写转换函数_字符处理——大小写转换编程思路扩展
  9. 《java编程思想》读书笔记(二)第五章(2)
  10. 2014-2015 ACM-ICPC, NEERC, Eastern Subregional Contest Problem H. Pair: normal and paranormal
  11. linux主机名hostname老是被更改为broad原理分析和恢复
  12. java 泰国_游记:泰国之旅
  13. 资产监测设备中,使用浏览器解码Sigfox上行负载
  14. 计算机辅助普通话水平测试第三项占多少分,计算机辅助普通话水平测试第三项朗读短文占...
  15. 测绘程序设计——度分秒与弧度制转化(C#)
  16. 乳腺肿瘤超声图像感兴趣区域的自动识别综述
  17. 描写火车站场景_描写火车站的句子
  18. 通过蚂蚁开放联盟链快速上链
  19. 犀牛书第七版学习笔记:数据类型与结构-数字
  20. 央行工作会议说了什么:定向调控 松紧适度

热门文章

  1. 搜索引擎之---Apache solr的实现
  2. 最常见的《最聪明的技巧》实战讲解!
  3. Spark 学习文章
  4. postgres 物理格式
  5. Windows系统编程之进程同步试验
  6. ASP.NET返回上一页面的实现方法
  7. ASP.NET 发邮件方法
  8. 各大品牌液晶显示器工程模式
  9. 使用spdevelop进行数据库建模
  10. 一般实现分布式锁都有哪些方式?