1.新建Account类,使用AtomicLong定义账户余额,增加和减少金额方法使用getAndAdd方法。

package com.xkzhangsan.atomicpack.bank;

import java.util.concurrent.atomic.AtomicLong;

public class Account {

    private AtomicLong balance = new AtomicLong();

    public void addAmount(long amount){
this.balance.getAndAdd(amount);
} public void substractAmount(long amount){
this.balance.getAndAdd(-amount);
} public long getBalance() {
return balance.get();
} public void setBalance(long balance) {
this.balance.set(balance);
} }

2.Bank和Company类与https://www.cnblogs.com/xkzhangsanx/p/10759690.html一致。

3.测试类

package com.xkzhangsan.atomicpack.bank;

public class Main {

    public static void main(String[] args) {
Account account = new Account();
account.setBalance(1000); Company company = new Company(account);
Thread companyThread = new Thread(company); Bank bank = new Bank(account);
Thread bankThread = new Thread(bank); System.out.printf("Account start money:%d\n", account.getBalance());
companyThread.start();
bankThread.start(); try {
companyThread.join();
bankThread.join();
System.out.printf("Account end money:%d\n", account.getBalance());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

4.测试结果

Account start money:1000
Bank substract 1000 balance:1000
Company add 1000 balance:1000
Company add 1000 balance:1000
Bank substract 1000 balance:0
Company add 1000 balance:2000
Company add 1000 balance:2000
Company add 1000 balance:3000
Company add 1000 balance:4000
Company add 1000 balance:5000
Company add 1000 balance:6000
Company add 1000 balance:7000
Company add 1000 balance:8000
Bank substract 1000 balance:1000
Bank substract 1000 balance:7000
Bank substract 1000 balance:6000
Bank substract 1000 balance:5000
Bank substract 1000 balance:4000
Bank substract 1000 balance:3000
Bank substract 1000 balance:2000
Bank substract 1000 balance:1000
Account end money:1000

参考:java7并发编程实战手册

GitHub地址:https://github.com/xkzhangsan/java-concurrent-practice

使用AtomicLong,经典银行账户问题的更多相关文章

  1. 使用synchronized同步,经典银行账户问题

    1.新建Account类,使用synchronized同步增加和减少金额方法. package com.xkzhangsan.synchronizedpack.bank; public class A ...

  2. 使用Semaphore同步,经典银行账户问题

    1.新建Account类,使用Semaphore同步增加和减少金额方法. package com.xkzhangsan.semaphorepack.bank; import java.util.con ...

  3. 使用ReentrantLock同步,经典银行账户问题

    1.新建Account类,使用ReentrantLock同步增加和减少金额方法. package com.xkzhangsan.reentrantlockpack.bank; import java. ...

  4. 简单练习题2编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能

    编写Java应用程序.首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”.“取款”和“余额查询”.其次, 编写一个主类,在主类中测试Account类的 ...

  5. 申请Payoneer美国万事达信用卡,可获得一个美国虚拟银行账户,立即注册可得25美元

    申请Payoneer美国万事达信用卡,可获得一个美国虚拟银行账户,可以在国内任意一个支持万事达的ATM.POS机上取现和刷卡消费.Payoneer可以网上购物,购买国外的产品,对我们有一个好处就是利用 ...

  6. 银行账户管理系统(oracle数据库连接池,数据库的链接,)

    /* * 银行账户管理系统: * 属性:账户id,姓名,金额salary,利息类型: *管理员模块实现的功能: * 1.给用户开户 * 2.查询所有账户信息 * 用户模块实现的功能: * 1.显示用户 ...

  7. OC1_银行账户类

    // // BankAccount.h // OC1_银行账户类 // // Created by zhangxueming on 15/6/10. // Copyright (c) 2015年 zh ...

  8. (转)Oracle EBS 有效银行账户取值 银行科目

    SELECT ba.bank_account_id, --银行账户key ftv.territory_short_name, --国家 ftv.territory_code, --国家简称 cb.ba ...

  9. Java实验-课程设计报告一:个人银行账户管理系统SavingAccountManageSystem-具体文档+源码

    课程设计报告一:个人银行账户管理系统 此文档及源码仅供参考 不得直接复制使用 author: [xxxxxxxxx xx xxxx] date: "2019-04-12" 作 者: ...

随机推荐

  1. PDF的水印怎么去掉

    很多朋友私下都有问过PDF去除水印的方法,现在在网上下载一些PDF电子书,几乎页面内都会有水印的,而且有的水印还带有超链接,稍微不注意就会点开进入别的页面内,不仅影响了阅读效果还带给读者负面影响,那如 ...

  2. Linux filesystem

    文件系统的运作与操作系统的文件数据有关.较新的操作系统的文件数据除了文件实际内容外,通常含有非常多的属性,例如Linux操作系统的文件权限(rwx)与文件属性(属主.属组.时间参数等).文件系统通常会 ...

  3. MYSQL定时任务 触发器

    流程: 查看时间调度器是否开启,OFF关闭,ON开启 SHOW VARIABLES LIKE 'event_scheduler' 设置开启 set GLOBAL event_scheduler = 1 ...

  4. nginx,maven

    nginx反向代理 负载均衡 keepalive高可用 lvs负载均衡算法 mvn build自定义命令 install安装到本地仓库

  5. js手机浏览器浏览WebApp弹出的键盘遮盖住文本框的解决办法

    if(window.navigator.userAgent.indexOf('Android') > -1 || window.navigator.userAgent.indexOf('Adr' ...

  6. spark1.3.x与spark2.x启动executor不同的cpu core分配方式

    ***这里的executor在worker上分配策略以spreadOut 为例*** 1.3版本关键点: for (app <- waitingApps if app.coresLeft > ...

  7. 冒泡排序(JAVA实现)

    基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒. 即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将 ...

  8. 【EBook】-NO.161.微服务.1 -【微服务架构与实践】

    Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...

  9. pwn学习日记Day1 基础知识积累

    ida / od 窗口(针对od操作) 反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址.HEX 数据.反汇编.注释可以通过在窗口中右击出现的菜单 界面选项->隐藏标题 或 显示标题 来进 ...

  10. PHP----------php封装的一些简单实用的方法汇总

    1.xml转换成array,格式不对的xml则返回false function xml_parser($str){    $xml_parser = xml_parser_create();    i ...