線程同步:java
當有兩個進程併發修改同一文件時就可能形成異常。多線程
意思就是當一個線程要改變一個文件的內容時,卻sleep了一段時間,這時另外一個線程卻改變了這個文件的內容。最後就會出現錯誤的結果。併發
爲了解決這個問題,java多線程支持引入了同步監視器來解決這個問題。使用同步監視器的通用方法就是同步代碼塊。this
同步代碼塊的語法格式以下:spa
synchronized(obj){線程
······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 }