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; } }