一、前情回顧
在多執行緒(一)中提到,多執行緒的使用是否一定是安全的呢?下面舉乙個例子來分析
該例子是乙個火車票售票系統,由三個視窗售票,用兩種建立多執行緒的方式來執行
①繼承的方式
package thread2;
//模擬火車站售票視窗,開啟三個視窗售票,總票數為100張
class window extends thread else
} }}public class testwindow
}
很明顯,該程式存在著執行緒的安全問題,執行可知。
②實現的方式
package thread2;
//使用實現runnable介面的方式,售票
class window1 implements runnable catch (interruptedexception e) //放大錯誤
system.out.println(thread.currentthread().getname() + "售票,票號為:"
+ ticket--);
} else
} }}public class testwindow1
}
我們應該如何解決這些安全問題呢,下面介紹執行緒的同步機制
二、同步
1.定義:同步是指程式中用於控制不同執行緒間操作發生相對順序的機制
2.同步方式
同步的方式一般分為兩種:①同步**塊 ②同步方法
①同步**塊
synchronized(同步監視器)
* 1.共享資料:多個執行緒共同操作的同乙個資料(變數)
* 2.同步監視器:由乙個類的物件來充當。哪個執行緒獲取此監視器,誰就執行大括號裡被同步的**。俗稱:鎖
* 要求:所有的執行緒必須共用同一把鎖!
class window2 implements runnable catch (interruptedexception e)
system.out.println(thread.currentthread().getname()
+ "售票,票號為:" + ticket--);}}
} }}public class testwindow2
}
注:在實現的方式中,考慮同步的話,可以使用this來充當鎖。但是在繼承的方式中,慎用this!
②同步方法
將操作共享資料的方法宣告為synchronized。即此方法為同步方法,能夠保證當其中乙個執行緒執行
此方法時,其它執行緒在外等待直至此執行緒執行完此方法。
同步方法的鎖:this
class window4 implements runnable
} public synchronized void show() catch (interruptedexception e)
system.out.println(thread.currentthread().getname() + "售票,票號為:" + ticket--);
} }}public class testwindow4
}
執行緒同步的弊端:由於同乙個時間只能有乙個執行緒訪問共享資料,效率變低了。
(部分****於尚矽谷宋紅康老師,在此感謝宋老師)
Java學習日記(6) 多執行緒
多執行緒 執行形式 兩種實現方式及區別 同步及死鎖 實現執行緒的兩種方式 繼承thread類 class 類名稱 extends thread 同步方法 synchronized 方法返回值 方法名稱 引數列表 推薦使用 同步可以保證資源共享的正確性,但過多的同步可能出現死鎖,即程式執行不了了。案例...
java學者日記 介面
介面 介面是抽象方法和常量值的定義的集合。這種技術主要用來描述類具有什麼功能,而並不給出每個功能的具體實現。乙個類可以實現乙個或多個介面,並在需要介面的地方,隨時使用實現了相應介面的物件 下面舉例說明介面的使用 一 介面的定義 inte ce usb 介面的定義注 介面裡的方法預設為 public ...
Java 多執行緒 二
執行緒安全問題 引出同步 塊 通過下面的例子,了解傳統多執行緒存在的執行緒安全隱患。需求 買票 四個視窗同時買票。class ticket implements runnable extends thread catch exception e system.out.println thread.c...