采用多线程机制模拟汇款业务。定义一银行类可接受顾客的汇款,其属性count用于存储账户金额。现有两名顾客,每人分三次、每次100元将钱汇入count。每进行一次汇款,便输出汇款人和账户总额。

Account类:

package com.bjpowernode.java.threadsafe3;

public class Account {

    // 账号

    private String actno;

    // 余额

    private double balance;

    public Account() {

    }

    public Account(String actno, double balance) {

        this.actno = actno;

        this.balance = balance;

    }

    public String getActno() {

        return actno;

    }

    public void setActno(String actno) {

        this.actno = actno;

    }

    public double getBalance() {

        return balance;

    }

    public void setBalance(double balance) {

        this.balance = balance;

    }

    public synchronized void save(double money){

        double before = this.getBalance(); // 100

        double after = before + money;

        try {

            Thread.sleep(1000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        this.setBalance(after);

    }

    //取款的方法

    /*

    在实例方法上可以使用synchronized吗?可以的。

        synchronized出现在实例方法上,一定锁的是this

        没得挑。只能是this。不能是其他的对象了。

        所以这种方式不灵活。

        另外还有一个缺点:synchronized出现在实例方法上,

        表示整个方法体都需要同步,可能会无故扩大同步的

        范围,导致程序的执行效率降低。所以这种方式不常用。

        synchronized使用在实例方法上有什么优点?

            代码写的少了。节俭了。

        如果共享的对象就是this,并且需要同步的代码块是整个方法体,

        建议使用这种方式。

     */

    public synchronized void withdraw(double money){

        double before = this.getBalance(); // 10000

        double after = before - money;

        try {

            Thread.sleep(1000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        this.setBalance(after);

    }

}

AccountThread类:

package com.bjpowernode.java.threadsafe3;

public class AccountThread extends Thread {

    // 两个线程必须共享同一个账户对象。

    private Account act;

    // 通过构造方法传递过来账户对象

    public AccountThread(Account act) {

        this.act = act;

    }

    public void run(){

        // run方法的执行表示取款操作。

        // 假设取款5000

        double money = 100;

        // 取款

        // 多线程并发执行这个方法。

       for (int i=0;i<3;i++){

           act.save(money);

           System.out.println(Thread.currentThread().getName() + ""+act.getActno()+"存款"+money+"成功,余额" + act.getBalance());

       }

    }

}

Test类:

package com.bjpowernode.java.threadsafe3;

public class Test {

    public static void main(String[] args) {

        // 创建账户对象(只创建1个)

        Account act = new Account("act-001", 10000);

        // 创建两个线程

        Thread t1 = new AccountThread(act);

        Thread t2 = new AccountThread(act);

        // 设置name

        t1.setName("t1");

        t2.setName("t2");

        // 启动线程取款

        t1.start();

        t2.start();

    }

}

实验运行截图:

采用多线程机制模拟汇款业务。定义一银行类可接受顾客的汇款,其属性count用于存储账户金额。现有两名顾客,每人分三次、每次100元将钱汇入count。每进行一次汇款,便输出汇款人和账户总额。_第1张图片

你可能感兴趣的:(java,开发语言)