方法一,同步代码块。方法二,同步方法。方法三,同步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(); } } }