文档章节

java同步之银行账户取款

demowu
 demowu
发布于 2016/12/09 16:15
字数 487
阅读 26
收藏 0

方式一:

package com.test;

/**
 * Created by piepie on 2016/12/9.
 */
/**
 * 账户
 */
class Account {
    //余额
    private double balance;

    //传递参数
    public Account(double balance) {
        super();
        this.balance = balance;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }
}

/**
 * 取钱的操作
 */
class ATM implements Runnable {
    private double dMoney;
    private Account account;

    public ATM( double dMoney,Account account) {
        this.account = account;
        this.dMoney = dMoney;
    }

    Object object = new Object();

    @Override
    public void run() {

// 采用同步的方式去,控制线程,一旦进入后就不能让其他的线程进入
        synchronized (account) {
            // 如果余款大于取钱的数就操作
            if (account.getBalance() > dMoney) {
                System.out.println(Thread.currentThread().getName()
                        + "取得的钱数目" + dMoney);
                //设置余额
                account.setBalance(account.getBalance()-dMoney);
                //显示余额
                System.out.println(Thread.currentThread().getName()
                        +"余额为"+account.getBalance());
            }else {
                System.out.println(Thread.currentThread().getName()
                        +"余额不足,余额仅剩"+ account.getBalance());
            }
        }
    }
}
public class drawMoney {
    public static void main(String[] args) {
        //初始化账户
        Account acc=new Account(2000);
        //取钱动作初始化
        ATM atm=new ATM(800,acc);
        new Thread(atm,"李明").start();
        new Thread(atm,"张红").start();
    }
}

方式二:

package com.test;

/**
 * Created by piepie on 2016/12/9.
 */


//账户
class Account2 {
    //余额
    private double balance;

    //传递参数
    public Account2(double balance) {
        super();
        this.balance = balance;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

//               同步方法
//       取钱

    /**
     * 同步方法的同步监听器对象:   若该方法是非静态的那么就是this
     * 若方法是静态那么就是同步方法所在类的  Class clz  =  Account2.class;(一份字节码)
     */

    public synchronized void draw(double drawMoney) {
// 能取钱的操作函数
        if (balance >= drawMoney) {
// 取出多少钱
            System.out.println(Thread.currentThread().getName() +
                    "取出多少钱" + drawMoney);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            }
// 设置账户余额还有多少
            setBalance(balance - drawMoney);
//           余额还有多少
            System.out.println(Thread.currentThread().getName() +
                    "账户的余额是:" + getBalance());
        } else {
            System.out.println(Thread.currentThread().getName() +
                    "账户余额不足,余额为:" + getBalance());
        }
    }
}

/**
 * 取钱
 */
class ATM1 implements Runnable {
    //      取得钱数
    private double drawMoney;
    private Account2 account2;

    public ATM1(double drawMoney, Account2 account2) {
        this.drawMoney = drawMoney;
        this.account2 = account2;
    }

    public void run() {

        account2.draw(drawMoney);
    }
}

public class synchronizedThread {
    public static void main(String[] args) {
        Account2 a = new Account2(2000);
        ATM1 atm = new ATM1(800, a);
// 对于相同的账户,不同的人去取钱
        new Thread(atm, "AA").start();
        new Thread(atm, "BB").start();
        new Thread(atm, "CC").start();
    }
}

© 著作权归作者所有

demowu
粉丝 0
博文 6
码字总数 3995
作品 0
成都
私信 提问
Java线程:条件变量 lock

条件变量是Java5线程中很重要的一个概念,顾名思义,条件变量就是表示条件的一种变量。但是必须说明,这里的条件是没有实际含义的,仅仅是个标记而已,并且条件的含义往往通过代码来赋予其含...

古月楼
2013/08/26
0
0
Java程序员从笨鸟到菜鸟之(六十五)细谈Hibernate(十六)数据库事务与隔离级别

数据库事务:事务是指一组相互依赖的操作行为,如银行交易、股票交易或网上购物。事务的成功取决于这些相互依赖的操作行为是否都能执行成功,只要有一个操作行为失败,就意味着整个事务失败。...

长平狐
2012/11/12
69
0
深入理解多线程(五)—— Java虚拟机的锁优化技术

本文是《深入理解多线程》的第五篇文章,前面几篇文章中我们从synchronized的实现原理开始,一直介绍到了Monitor的实现原理。 前情提要 通过前面几篇文章,我们已经知道: 1、同步方法通过关...

2018/04/21
0
0
Java原理 事务的ACID是指什么?

Java原理 事务的ACID是指什么?一、什么是Java事务通常的观念认为,事务仅与数据库相关。事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性 ...

勇往直前的麻雀
2017/10/20
0
0
并发编程基础四--同步代码块,同步方法,lock,死锁

老生常谈的一个问题,就bank的那个例子,同一张卡同时取钱,并发2个,每个取800,但卡里只有1000,不能让2个人同时操作.这里就需要线程同步.比如下面的DEMO. 首先定义一个账户类: package org.cre...

Zhao-Qian
2013/02/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ubuntu或ubuntu kylin优麒麟中安装QQ、wechat微信、百度网盘

从中国国内的地址下载deepin wine,码云上的。这样网速比较快。然后,按照说明向下安装。 https://gitee.com/wszqkzqk/deepin-wine-for-ubuntu...

gugudu
26分钟前
1
0
基于redis分布式锁实现“秒杀”

最近在项目中遇到了类似“秒杀”的业务场景,在本篇博客中,我将用一个非常简单的demo,阐述实现所谓“秒杀”的基本思路。 业务场景 所谓秒杀,从业务角度看,是短时间内多个用户“争抢”资源...

别打我会飞
46分钟前
13
0
Zookeeper的实践指南

本章重点 1.数据存储2.基于Java API初探Zookeeper的使用3.深入分析Watcher机制的实现原理4.Curator客户端的使用,简单高效 数据存储 事务日志快照日志运行时日志 bin/zookeepe...

须臾之余
49分钟前
1
0
MySQL mybatis Point类型数据

MySQL中的point用于表示GIS中的地理坐标,在GIS中广泛使用 如何写入mysql,如下图: CREATE TABLE `test-point` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '序号', `point` ......

张欢19933
今天
2
0
设计模式-适配器模式

适配器模式 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入...

HOT_POT
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部