方法一,同步代码块。方法二,同步方法。方法三,同步lock
同步代码块,synchronized在线程的run方法里。同步监视器是Account类。
class Account {
private String accountNo;
private double balance;
public Account(){}
public Account(String accountNo, double balance)
{
this.accountNo = accountNo;
this.setBalance(balance);
}
public void setAccountNo(String accountNO)
{
this.accountNo = accountNO;
}
public String getAccountNo()
{
return this.accountNo;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
}
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;
}
public void run()
{
//同步代码块
synchronized(account)
{
if(account.getBalance() >= drawAmount)
{
System.out.println(getName()+"取钱成功!吐出钞票:"+drawAmount);
try
{
Thread.sleep(1);
}
catch(InterruptedException ex)
{
ex.printStackTrace();
}
account.setBalance(account.getBalance() - drawAmount);
System.out.println("余额为:"+ account.getBalance());
}
else
{
System.out.println(getName()+ "取钱失败!余额不足!");
}
}
}
}
同步方法,synchronized在主类里。同步监视器是调用这个方法的类,即this
public class Account2 {
private String accountNo;
private double balance;
public Account2(){}
public Account2(String accountNo, double balance)
{
this.setAccountNo(accountNo);
this.setBalance(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 synchronized void draw(double drawAmount)
{
if(balance >= drawAmount)
{
System.out.println(Thread.currentThread().getName()+"取钱成功!吐出钞票:"+drawAmount);
try
{
Thread.sleep(1);
}
catch(InterruptedException ex)
{
ex.printStackTrace();
}
balance -= drawAmount;
System.out.println("余额为:"+balance);
}
else
{
System.out.println(Thread.currentThread().getName()+"取钱失败!余额不足!");
}
}
}
同步锁使用Lock对象作为同步监视器,在finally里解锁
import java.util.concurrent.locks.ReentrantLock;
//同步锁lock
public class Account3 {
private final ReentrantLock lock = new ReentrantLock();
private String accountNo;
private double balance;
public Account3(){}
public Account3(String accounNo, double balance)
{
this.setAccountNo(accountNo);
this.setBalance(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(balance >= drawAmount)
{
System.out.println(Thread.currentThread().getName()+"取钱成功!吐出钞票:"+drawAmount);
try
{
Thread.sleep(1);
}
catch(InterruptedException ex)
{
ex.printStackTrace();
}
balance -= drawAmount;
System.out.println("余额为:"+balance);
}
else
{
System.out.println(Thread.currentThread().getName()+"取钱失败!余额不足!");
}
}
finally
{
lock.unlock();
}
}
}