- 定义account类
package newThread;
import java.util.concurrent.locks.ReentrantLock;
public class Account {
private String accountNo;
private double balance;
public Account() {
super();
}
public Account(String accountNo, double balance) {
super();
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;
}
@Override
public int hashCode() {
return accountNo.hashCode();
//返回对象的编码
}
@Override
public boolean equals(Object obj) {
if(obj!=null&&obj.getClass()==Account.class) {
Account target=(Account) obj;
return target.getAccountNo().equals(accountNo);
}
return false;
}
//②线程同步方法,且synchronized 修饰的方法默认的同步监视器是this
/*public synchronized void draw(double drawAmount) {
if(balance>=drawAmount) {
System.out.println(Thread.currentThread().getName()+"取钱成功!--"+drawAmount);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
balance-=drawAmount;
System.out.println("\t余额为:"+balance);
}else {
System.out.println(Thread.currentThread().getName()+"取钱失败!余额不足");
}
}*/
//③同步锁--可重入锁reentrantlock
private final ReentrantLock lock=new ReentrantLock();
public void draw(double drawAmount) {
lock.lock();
try {
if(balance>=drawAmount) {
System.out.println(Thread.currentThread().getName()+"取钱成功!--"+drawAmount);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
balance-=drawAmount;
System.out.println("\t余额为:"+balance);
}else {
System.out.println(Thread.currentThread().getName()+"取钱失败!余额不足");
}
}
finally {
lock.unlock();
}
}
}
- 定义线程类
package newThread;
public class DrawThread extends Thread {
private Account account;//模拟用户账户
private double drawAmount;
public DrawThread(String name, Account account, double drawAmount) {
super(name);
this.account = account;
this.drawAmount = drawAmount;
}
@Override
public void run() {
/*synchronized (account) {//①同步代码块
if(account.getBalance()>=drawAmount) {
System.out.println(getName()+"取钱成功!--"+drawAmount);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
account.setBalance(account.getBalance()-drawAmount);
System.out.println("\t余额为:"+account.getBalance());
}else {
System.out.println(getName()+"取钱失败!余额不足");
}
}*/
account.draw(drawAmount);
}
}
3.测试的类:测试①②③种方法实现的线程同步
package newThread;
public class TestDraw {
public static void main(String[] args) {
Account acct=new Account("123456780",1000);
new DrawThread("甲",acct,800).start();
new DrawThread("乙",acct,800).start();
}
}