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;
    }
}
京公网安备 11010502036488号