閱讀1042 返回首頁    go 阿裏雲 go 技術社區[雲棲]


java線程學習4——線程同步之同步代碼塊

 

模擬一個場景,兩個人對同一個賬戶同時取錢

 

package cn.xy.Thread;

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

 @Override
 public int hashCode()
 {
  return accountNo.hashCode();
 }

 @Override
 public boolean equals(Object obj)
 {
  if (null != obj && obj.getClass() == Account.class)
  {
   Account target = (Account) obj;
   return target.accountNo.equals(accountNo);
  }
  return false;
 }

 /***************************************************************************/

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

 

package cn.xy.Thread;

public class DrawThread extends Thread
{
 /**
  * 模擬賬戶
  */
 private Account ac;

 /**
  * 當前取錢線程希望取得的錢數
  */
 private double drawAmount;

 public DrawThread(String name, Account ac, double drawAmount)
 {
  super(name);
  this.ac = ac;
  this.drawAmount = drawAmount;
 }

 @Override
 public void run()
 {
  // 同時需要操作的賬戶作為同步監視器,synchronized{}中的代碼被稱為同步代碼塊
  synchronized (ac)
  {
   if (ac.getBalance() >= drawAmount)
   {
    System.out.println(getName() + "取出鈔票成功" + drawAmount);
    ac.setBalance(ac.getBalance() - drawAmount);
    System.out.println("餘額為" + ac.getBalance());
   }
   else
   {
    System.out.println("餘額不足");
   }
  }
 }
}

 

package cn.xy.Thread;

public class Test
{
 public static void main(String[] args)
 {
  Account ac = new Account("00000001",1000);
  Thread t1 = new Thread(new DrawThread("Lily", ac, 800));
  Thread t2 = new Thread(new DrawThread("Tom", ac, 800));
  t1.start();
  t2.start();
 }
}

 

 

最後更新:2017-04-03 20:19:46

  上一篇:go Mybatis中模煳查詢的各種寫法
  下一篇:go ibatis中動態語句的iterate標簽