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号