java中線程的同步

線程同步:java

當有兩個進程併發修改同一文件時就可能形成異常。多線程

意思就是當一個線程要改變一個文件的內容時,卻sleep了一段時間,這時另外一個線程卻改變了這個文件的內容。最後就會出現錯誤的結果。併發

爲了解決這個問題,java多線程支持引入了同步監視器來解決這個問題。使用同步監視器的通用方法就是同步代碼塊。this

同步代碼塊的語法格式以下:spa

synchronizedobj){線程

······code

//此處的代碼就是同步代碼塊對象

blog

上面語法格式中synchronized後括號裏的obj就是同步監視器,上面代碼的含義是:線程開始執行同步代碼塊以前,必須先得到對同步監視器的鎖定。進程

 

注意:

任什麼時候刻智能有一個線程能夠得到對同步監視器的鎖定,當同步代碼塊執行完成後,該線程會釋放對該同步監視器的鎖定。

 

同步監視器:共享資源的對象。

 1 public class SynchronizedClass extends Thread{
 2     private Account account;
 3     private double drawbalance;
 4     public SynchronizedClass(String name,Account account,double drawbalance){
 5         super(name);
 6         this.account=account;
 7         this.drawbalance=drawbalance;
 8         start();
 9     }
10     public void run(){
11         synchronized(account){
12             if(drawbalance>account.getBalance()){
13                 System.out.println("餘額不足!");
14             }else{
15                 System.out.println("吐錢成功!");
16                 try{
17                     sleep(100);
18                     account.setBalance(account.getBalance()-drawbalance);
19                     System.out.println("餘額爲:"+account.getBalance());
20                 }catch(Exception e){
21                     System.out.println(e);
22                 }
23             }
24         }
25     }
26     public static void main(String[] args){
27         Account a=new Account("劉騰",100000);
28         new SynchronizedClass("A線程",a,100000);
29         new SynchronizedClass("B線程",a,10000);
30     }
31 }
32 //帳戶
33 class Account {
34     private String name;
35     private double balance;
36     public Account(){}
37     public Account(String name,double balance){
38         this.name=name;
39         this.balance=balance;
40     }
41     public void setName(String name){
42         this.name=name;
43     }
44     public void setBalance(double balance){
45         this.balance=balance;
46     }
47     public String getName(){
48         return name;
49     }
50     public double getBalance(){
51         return balance;
52     }
53     public boolean equals(Object obj){
54         if(this==obj)return true;
55         if(obj!=null)return false;
56         if(getClass()!=obj.getClass())return false;
57         Account other =(Account) obj;
58         if(other.name==name&&other.balance==balance)return true;
59         else return false;
60     }
61 }
相關文章
相關標籤/搜索