Lock是java5新增的同步机制,同步锁可以由Lock对象充当。某些锁可以允许对共享资源进行并发访问,比如ReentranReadWriteLock。Lock比同步方法与同步代码块更为灵活:比如有获取可中断锁的方法lockInterruptibly()方法,获取超时失效锁的tryLock(long,TimeUnit)方法等。利用Lock对Account类进行改写。

public class Account {
    private final ReentrantLock lock = new ReentrantLock();
    private String accountNo;
    private double balance;

    public Account() {
    }

    public Account(String accountNo, double balance) {
        this.accountNo = accountNo;
        this.balance = balance;
    }

    public String getAccountNo() {
        return accountNo;
    }

    public void setAccountNo(String accountNo) {
        this.accountNo = accountNo;
    }

    public double getBalance() {
        return balance;
    }

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

    public void draw(double drawAmount) {
        lock.lock();
        try {
            if (getBalance() >= drawAmount) {
                System.out.println(Thread.currentThread().getName()
                        + " draw money:" + drawAmount);
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                setBalance(getBalance() - drawAmount);
                System.out.println("The blance is:" + getBalance());
            } else {
                System.out.println(Thread.currentThread().getName()
                        + "The blance is not enough!");
            }
        } finally {
            lock.unlock();
        }
    }

    @Override
    public int hashCode() {
        return accountNo.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this)
            return true;
        if (obj != null && obj.getClass() == Account.class) {
            Account target = (Account) obj;
            return target.getAccountNo().equals(accountNo);
        }
        return false;
    }
}