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. Gym 101606B - Breaking Biscuits - [凸包+旋转卡壳][凸包的宽度]

    题目链接:https://codeforces.com/gym/101606/problem/B 题解: 对于给出的 $n$ 个点,先求这些点的凸包,然后用旋转卡壳求出凸包的宽度(Width (min ...

  2. 《Redis 命令操作》

    一:Redis 的启动与关闭 - 关闭指定端口的 Redis - redis-cli -p 9200 shutdown - 开启 Redis - redis-server redis.config 二 ...

  3. Jmeter压测基础(二)——Badboy功能、Jmeter参数化、检查点、集合点、动态关联、图形监控

    Badboy 以下稍微介绍一下badboy的部分功能: 1.Record;play(badboy打开后默认是recording状态) 2.Assertion(检查点/断言) 3.Variable: t ...

  4. highcharts-3d.js实现饼状图

    嘛,首先,废话一下,这个插件挺好用的.我是因为做亮灯率demo所以接触了它. 首先引用外部文件,jQuery.js,highcharts.js,highcharts-3d.js,好的,这就搞定了第一步 ...

  5. 关于autofac的一些具体的用法

    简介:Autofac是一个.net下非常优秀,性能非常好的IOC容器(.net下效率最高的容器) 1.nuget 引用 2.创建两个类库项目,IService (用于编写接口),ServiceImpl ...

  6. ceph的正常卸载与非正常卸载

    一.ceph的正常卸载与非正常卸载 一.正常卸载(通过ceph-deploy卸载) 环境已安装ceph-deploy 1.查看ceph-deploy的帮助信息 [cephde@controller03 ...

  7. sed memo 2

    配置文件注释过滤 示例文件 [user_00@txyun test]$ cat sed_test # comment aaaaaaaaaaa bbbb #comment cccc dddd fffo ...

  8. crypto++

    CryptoPP库是一个C++书写的加密算法库,很棒. 在如今的抛却数字证书体系下,只关注公私钥对的情况下,我认为存粹的加解密算法库很有市场,虽然我以前觉得PolarSSL的加解密算法实现不错,但不影 ...

  9. webpack基础小结。

    想写写webpack的学习体验的小结,加深自己的理解和使用技能,顺便过一下文档(4.0的功能感觉还是满好玩的). 本文主简写描述webpack中对各种文件的简单处理 基本知识点 处理js 加载css文 ...

  10. C++实验三

    part2 graph.h #ifndef GRAPH_H#define GRAPH_H// 类Graph的声明 class Graph { public: Graph(char ch, int n) ...