1.有一张银行卡:*属性:name,money(账户余额)*

多线程操作同一张银行卡:
金额:x(每次存钱取钱的数额,取钱时x为负数,存钱时x为整数)

定义一个add方法:用于存取钱,参数为x,即每次取或存的金额

add(int x){
判断x的正负
要么存,要么取
显示余额
}

多线程实现可以存钱也可以取钱,保证线程的安全.

分析:

线程安全是指保证进入执行状态的线程能将当次行为执行完成,即实现同步金额是后台输入的,或直接使用随机数解决

代码:

方法一:直接操作,以及后台输入金额

package Homework;import java.util.Scanner;public class Test1 {public static void main(String[] args) {Card card=new Card("中国银行卡",0);MyThread thread=new MyThread(card);MyThread thread2=new MyThread(card);MyThread thread3=new MyThread(card);thread.start();thread2.start();thread3.start();}
}
//银行卡类
class Card{private String name;private int money;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getMoney() {return money;}public void setMoney(int money) {this.money = money;}@Overridepublic String toString() {return "Card [name=" + name + ", money=" + money + "]";}public Card(String name, int money) {super();this.name = name;this.money = money;}public Card() {super();}//定义的add方法,操作账户进行存取钱public synchronized void add(int num){int money1=getMoney();setMoney(money1+num);if(num>0){System.out.println(Thread.currentThread().getName()+"【存】了"+num+"元,当前"+getName()+"余额为:"+getMoney());try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}}else {System.out.println(Thread.currentThread().getName()+"【取】了"+(-num)+"元,当前"+getName()+"余额为:"+getMoney());try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}}}
}//线程
class MyThread extends Thread{Card card;public MyThread(Card card){this.card=card;}@Overridepublic void run() {Scanner input=new Scanner(System.in);while(true){synchronized (card) {System.out.println("请输入金额:");int num=input.nextInt();card.add(num);}}}
}

运行结果:

方法二:使用标志位,以及随机数

银行卡类:

package com.qf.demo;public class Card1 {private int money = 0;boolean flag = true; //true 取了钱,但是还没存     取钱的等着   存钱的执行// false   存了钱了,但是没取          存钱的等着   取钱的执行public Card1(int money) {super();this.money = money;}public Card1() {super();}public int getMoney() {return money;}public void setMoney(int money) {this.money = money;}@Overridepublic String toString() {return "Card1 [money=" + money + "]";}public synchronized void save(){if(flag == false){// 存了还没取   存钱等着try {this.wait();// 挂起来的是  存钱的线程} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// 就证明是true 取了还没存this.money+=1000;System.out.println("存了1000,还剩下"+this.money);// 已经存完钱了flag = false;this.notify();}public synchronized void get(){if(flag==true){// true   取了还没存     取钱的等着   存钱的 执行try {this.wait();// 挂起来的是取钱的线程} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// 没进去wait 就证明flag 是false     存了还没取this.money = this.money-1000;System.out.println("取了1000,还剩"+this.money);// 取完钱了flag = true;this.notify();}
}

测试类与子线程:

package com.qf.demo;public class Test {public static void main(String[] args) {Card card = new Card();MyThread thread = new MyThread(card);MyThread thread2 = new MyThread(card);thread.start();thread2.start();}
}class Card{private String name;private int money ;public Card(String name, int money) {super();this.name = name;this.money = money;}public Card() {super();}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getMoney() {return money;}public void setMoney(int money) {this.money = money;}@Overridepublic String toString() {return "Card [name=" + name + ", money=" + money + "]";}// 最小作用域最强原则: 局部变量和 全局变变量同名的时候,在这个方法中优先使用的是  局部变量public void add(int money){if(money>0){this.money = this.money+money;System.out.println(Thread.currentThread().getName()+"存了"+money+"余额为"+this.money);}else {this.money = this.money+money;System.out.println(Thread.currentThread().getName()+"取了"+(-money)+"余额为"+this.money);}}
}class MyThread extends Thread{Card card;public MyThread(Card card) {this.card = card;}@Overridepublic void run() {// -499~500for (int i = 0; i < 20; i++) {synchronized (card) {int a = (int)(Math.random()*1000+1)-500;card.add(a);}}}
}

运行结果

Java之线程同步练习相关推荐

  1. JAVA中线程同步的方法(7种)汇总

    JAVA中线程同步的方法(7种)汇总 同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法. ...

  2. JAVA中线程同步的几种实现方法

    JAVA中线程同步的几种实现方法 一.synchronized同步的方法: 1.synchronized同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁, ...

  3. java实现线程同步的方法_Java实现线程同步方法及原理详解

    一.概述 无论是什么语言,在多线程编程中,常常会遇到多个线同时操作程某个变量(读/写),如果读/写不同步,则会造成不符合预期的结果. 例如:线程A和线程B并发运行,都操作变量X,若线程A对变量X进行赋 ...

  4. Java高级-线程同步机制实现

    2019独角兽企业重金招聘Python工程师标准>>> 前言 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Threa ...

  5. Java实现线程同步的方式

    1. synchronized关键字 synchronized关键字保证在同一时刻,只有一个线程可以执行某个对象内某一个方法或某一段代码块. 重量级锁.包含两个特征:互斥性和可见性. synchron ...

  6. Java基础 线程同步

    线程的同步:在编程过程中,为了防止多线程访问共享资源时发生冲突,Java提供了线程同步机制.所谓同步,就是指一个线程等待另一个线程操作完再继续的情况. 线程安全:一个类很好地同步以保护它的数据,这个类 ...

  7. java thirteen线程同步机制

    2019独角兽企业重金招聘Python工程师标准>>> 解决资源共享问题的方法一般是在指定时间段内只允许一个线程访问共享资源,这时就需要给共享资源上一道锁,比如售票员售票,当一个售票 ...

  8. Java 多线程 线程同步

    线程同步 1.发生在多个线程操作同一个资源 2.并发:同一个对象被多个线程同时操作 3.于是,就需要线程同步.线程同步其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等 ...

  9. Java的线程同步 并发操作

    并发:CUP在同一时间或同一时段内只能执行一件事情,而不同时件执行时,切换得十分快速,因为CUP的频率非常高,切换的速度人根本感受不出来. 同步:同步是多个任务进行时,按照一定的规律进行着. 线程并发 ...

最新文章

  1. Java 数值大小比较
  2. javascript 设计模式_开发者都应该了解的7种JavaScript设计模式
  3. 研究:低智商男人易出轨
  4. 搭建 ELK 问题排查
  5. 基金一般拿多长时间合适?
  6. 只十分钟,唾手可得的工作机会就被我搞砸了!
  7. chrome怎么调用硬件_浏览器发展简史——IE帝国是如何被chrome打败的?
  8. OA并发用户数(转)
  9. Android 多层视差头部背景的实现
  10. 征战FPGA之制作FLASH烧写用的bin文件
  11. ftp客户端flashfxp破解教程
  12. 吃鸡服务器维护公告10月19日,绝地求生10月30日维护公告更新内容 今天吃鸡几点开服时间...
  13. 基于Flash的开源网页播放器使用方法(FlowPlayer/AdobePlayer)
  14. 2022年最新WordPress主题更新列表(2022年5月28日)
  15. win10电脑任务栏突然卡死解决办法
  16. 红光光浴到底有没有用#大健康#红光光浴#红光#种光光学
  17. 显示器分辨率一直跳_显示器屏幕一直跳怎么办
  18. 墨者Bash漏洞分析溯源题解
  19. python主函数写法
  20. 搜狗词库scel格式转为txt格式(python3版本)

热门文章

  1. 机器学习 聚类篇——DBSCAN的参数选择及其应用于离群值检测
  2. 画直线_在鸡的面前画直线,鸡为什么会晕呢,西瓜视频带你揭秘
  3. 跨链(6)波卡Polkadot “系统框架”
  4. 《研磨设计模式》chap18 状态模式state(1)模式简介
  5. python网络编程—Socket
  6. [Issue Fixed]-repo-error: .repo/manifests/: contains uncommitted changes
  7. python:将json数据写入到excel
  8. 基于Redis实现分布式部署单点登录
  9. 所有程序自适应高分辨率(未完善)
  10. 点击EditText外部区域失去焦点的方法