軟體構造複習6

2021-10-07 23:54:36 字數 2255 閱讀 2828

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 覆蓋的情況即為 異常情...