1 public class SynchronizedClass1 extends Thread{ 2 private Account account; 3 private double drawbalance; 4 public SynchronizedClass1(String name,Account account,double drawbalance){ 5 super(name); 6 this.account=account; 7 this.drawbalance=drawbalance; 8 start(); 9 10 } 11 public void run(){ 12 for(int i=0;i<20;i++){ 13 try{sleep(1000);}catch(Exception e){} 14 account.draw(drawbalance);} 15 } 16 public static void main(String[] args){ 17 Account a=new Account("劉騰",100000); 18 new SynchronizedClass1("A線程",a,100); 19 Thread rt=new Thread(new RunnableClass(a)); 20 rt.setName("B線程"); 21 rt.start(); 22 } 23 } 24 //帳戶 25 class Account { 26 private String name; 27 private double balance; 28 public Account(){} 29 public Account(String name,double balance){ 30 this.name=name; 31 this.balance=balance; 32 } 33 public void setName(String name){ 34 this.name=name; 35 } 36 public void setBalance(double balance){ 37 this.balance=balance; 38 } 39 public String getName(){ 40 return name; 41 } 42 public double getBalance(){ 43 return balance; 44 } 45 public boolean equals(Object obj){ 46 if(this==obj)return true; 47 if(obj!=null)return false; 48 if(getClass()!=obj.getClass())return false; 49 Account other =(Account) obj; 50 if(other.name==name&&other.balance==balance)return true; 51 else return false; 52 } 53 public synchronized void draw(double drawbalance ){ 54 if(drawbalance>getBalance()){ 55 System.out.println("餘額不足!"); 56 }else{ 57 System.out.println("吐錢成功!"); 58 try{ 59 Thread.sleep(1000); 60 setBalance(getBalance()-drawbalance); 61 System.out.println("餘額爲:"+getBalance()); 62 }catch(Exception e){ 63 System.out.println(e); 64 } 65 } 66 } 67 } 68 class RunnableClass implements Runnable{ 69 private Account account; 70 //private double drawbalance; 71 public RunnableClass(Account account){ 72 this.account=account; 73 } 74 public void run(){ 75 for(int k=0;k<15;k++){ 76 try{Thread.sleep(1000); 77 System.out.println(account.getBalance()); 78 }catch(Exception e){} 79 } 80 } 81 }
問題:一個Account實例,傳到兩個線程中,一個線程(1)執行它的同步代碼方法,另外一個線程(2)執行它的普通方法。我在同步代碼塊中讓其線程進入休眠。按理說只要進入同步代碼塊,這個類就被加鎖了,另一個線程不該該執行撒。爲何就在(1)休眠的狀態下,(2)卻執行了?求教!!!this