線程問題求教!謝謝

 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

相關文章
相關標籤/搜索