1.併發
建立執行緒:
1.繼承thread類,重寫run()方法
new hellowthread().start();開始執行緒
2.實現runnable介面,重寫run()方法
new thread(new hellowthread()).start();開始執行緒
特性:雖然有多執行緒,但只有乙個核,每個時刻只能執行乙個執行緒
執行緒的競爭:
單行、單條語句都未必是原子的
看下面這個例子:
每乙個賦值語句分為三部分:
1.從靜態變數x中讀出數值
2.執行乘法運算
3.將結果賦值給x
於是可能出現的結果是5,6,10,30
訊息傳遞機制也無法解決競爭條件問題
執行緒的休眠:thread.sleep(time),將某個執行緒休眠,意味著其他執行緒得到更多的執行機會,進入休眠的執行緒不會失去對現有monitor或鎖的所有權
向執行緒發出中斷訊號:t.interrupt() ,在其他執行緒裡向t發出中斷訊號
檢查執行緒是否被中斷:t.isinterrupted()
正常執行期間,即使接收到中斷訊號,也不理會,只是改變了執行緒的中斷狀態
sleep,join,wait等能相應中斷訊號,並丟擲異常,經過異常處理,才算真正結束程序
thread.yield(): 使用該方法,執行緒告知排程器:我可以放棄cpu的占用權,從而可能引起排程器喚醒其他執行緒
thread.join(): 讓當前執行緒保持執行,直到其執行結束
2.執行緒安全
保證執行緒安全的方法:
限制資料共享
共享不可變資料
共享執行緒安全的可變資料
同步機制:通過鎖的機制共享執行緒不安全的可變資料,變並行為序列
具體方法:
1.執行緒之間不共享mutable資料型別
2.避免全域性變數
3.如果乙個adt的rep中包含mutable的屬性且多執行緒之間對其進行mutator操作,那麼就很難使用confinement策略來確保該adt是執行緒安全的
4.使用不可變資料型別和不可變引用,避免多執行緒之間的race condition
3.鎖與同步
使用鎖機制,獲得對資料的獨家mutation權,其他執行緒被阻塞,不得訪問
要互斥,必須使用同乙個lock進行保護
方法1:
方法2:
這種方法預設synchronized(this),用自身的例項做鎖,物件層面
方法3:
加入static關鍵字,用這個類做鎖,類層面
被同乙個鎖保護的執行緒a,執行緒b
執行緒a執行完後,執行緒b執行
執行緒a的結果或影響能被執行緒b獲取
注意事項:
1.任何共享的mutable變數/物件必須被lock所保護,涉及到多個mutable變數的時候,它們必須被同乙個lock所保護
死鎖:多個執行緒競爭lock,相互等待對方釋放lock
o.wait(): 釋放當前擁有o鎖的執行緒,使其進入等待序列
o.notify(): 喚醒擁有o鎖的某個執行緒
o.notifyall(): 喚醒擁有o鎖的所有執行緒
軟體構造複習
1.3.1 瀑布式開發過程 基本活動 制定計畫 需求分析 軟體設計 程式編寫 軟體測試 執行維護 問題 階段劃分僵硬,每個階段不能預設,而且產生大量文件,增加了工作量 開發是線性的,只有等到整個過程的末期才能見到開發成果 可執行軟體,不利於快速響應變化的需求 早期的錯誤要等到開發後期的測試階段才能發...
軟體構造複習3 5
vs equals 對於基本資料型別,使用 非基本資料型別,其值表示的是位址,類似指標。物件型別使用equals,使用的是overload,因此要注意好引數的型別,不同的型別會導致對比的依據不同 對於inreger,使用 要求範圍在 128 127之間,可以直接比較 overload vs over...
軟體構造複習2
外部質量和內部質量 外部質量影響使用者,內部質量影響軟體本身和他的開發者,外部 質量取決於內部質量。最後只有外部質量起作用。外部質量 1.正確性 按照預先定義的 規約 執行,最重要的質量指標 健壯性 針對異 常情況的處理,出現異常時不要 崩潰 未被 specification 覆蓋的情況即為 異常情...