只需要耽搁您2分钟时间就可以解决缠绕我心中的迷雾,往这里看。

       最近在研究多线程编程,有一些问题把我给绕住了,望能给予指点,不胜感激。

最基本的一个:模仿取钱操作

public class Account {
private
String accountNum; private double balance; public Account() { } public Account(String accountnum, double balance) { this.accountNum = accountnum; this.balance = balance; } public void setAccountNum(String accountNum) { this.accountNum = accountNum; } public void setBalance(double balance) { this.balance = balance; } public String getAccountNum() { return accountNum; } public double getBalance() { return balance; } @Override public int hashCode() { return this.accountNum.hashCode(); } @Override public boolean equals(Object obj) { if(this==obj){ return true; } if(obj!=null&&obj.getClass()==Account.class){ Account target = (Account)obj; return target.getAccountNum().equals(this.getAccountNum()); } return false; }
public class DrawMoney implements Runnable{
    private Account account;
    private double drawNum;
    public DrawMoney(String name,Account account,double drawnum){
        this.account = account;
        this.drawNum = drawnum;
    }
    public void setAccount(Account account) {
        this.account = account;
    }
    public Account getAccount() {
        return account;
    }
    public void setDrawNum(double drawNum) {
        this.drawNum = drawNum;
    }

    public double getDrawNum() {
        return drawNum;
    }
    @Override
    public void run() {
        synchronized (account) {
            String name = Thread.currentThread().getName();
        if(drawNum<=this.account.getBalance()){
            System.out.println(name+"取钱成功!"+this.drawNum);
            this.account.setBalance(this.account.getBalance()-this.drawNum);
            System.out.println(name+"余额为2:"+this.account.getBalance());
        }
        else{
            System.out.println("余额不足,无法完成取钱");
        }
        }
    }
    public static void main(String[] args) {
        Account account =new Account("zhangsan", 1000);
        DrawMoney dw1 = new DrawMoney("zhangsan", account, 800);
        DrawMoney dw2 = new DrawMoney("lisi", account, 800);
//        第一种模拟方式
        Thread t1 = new Thread(dw1);t1.setName("zhangsan");
        Thread t2 = new Thread(dw1);t2.setName("lisi");
//        t1.start();
//        t2.start();
//        第二种模拟方式
        Thread tt1 = new Thread(dw1);tt1.setName("zhangsan");
        Thread tt2 = new Thread(dw2);tt2.setName("lisi");
        tt1.start();
        tt2.start();
    }
    
}

 

问题:我想知道第一种和第二种模拟方式相同吗?

第一种模拟方式相当于只new了一个DrawMoney,然后给出两个Thread线程对他进行操作。此时的synchronized里面的锁必须是account,

第二种模拟方式相当于new了两个DrawMoney,但是这两个DrawMoney是针对同一账户的,然后给出两个Thread,此时的synchronized里面的锁可以是account和this

问这两种方式有区别吗?望指点.小弟多谢.