软件构造学习笔记-第十四周、十五周
課程進入了尾聲。本周內容主要是線程安全相關。線程錯誤比一般的錯誤更加難以發現和修改,甚至加入一條print語句就能改變時間分片,從而導致錯誤消失。重點介紹了“鎖”的機制,在使用時避免對整個方法進行lock,而是對可能發生線程不安全的指令進行lock操作,以免程序性能受到明顯影響。同時避免“死鎖”現象發生,在使用多個lock時注意順序。
并發
1.并行:將程序布置在多個CPU上執行。
并發:將任務拆分為多個階段,在同一個CPU上執行(切片)。
2.并發的兩個模型:共享內存(只能用于線程)和消息傳遞(線程、進程)。
進程和線程
1.進程和線程都是并發模塊的類型。進程比較“重量級”,私有空間,彼此隔離;線程“輕量級”,是程序內部的控制機制。一個進程可以形成多個線程。
2.每個應用至少有一個線程,主線程可以創建其它的線程。
3.創建線程的方法:繼承Thread;從Runnable接口構造Thread對象。
創建線程需要調用Thread類的start方法,不能運行具體的run方法
交錯(Interleaving)和競爭
1.時間分片:雖然有多個線程,但只有一個CPU,每個時刻只能執行一個線程。通過時間分片在多個進程/線程間共享處理器。由操作系統自動調度。
2.共享內存時的競爭情況
不恰當的分片操作會導致錯誤。右側A和B發生了競爭/線程干擾。
共享內存多線程的運行結果實例,每條語句可劃分為讀取-計算-寫回三個原子操作
3.消息傳遞時的競爭情況
由于時間分片,消息傳遞機制也無法解決競爭問題。
4.調用方法主動影響交錯現象
①Thread.sleep(time) 線程休眠time毫秒
②Thread.interrupt() 向線程發出中斷信號,例如t.interrupt(),即在其它線程里向t發出中斷信號。收到中斷信號后t不一定中斷,由t本身決定。正常運行期間,即使收到中斷信號也不會理會;在休眠時收到中斷信號則拋出異常。
③Thread.join() 讓線程保持執行,直到其執行結束。執行該操作時,也會檢測其它線程發來的中斷信號。
t1收到中斷信號時,如果一次循環都未執行,則先輸入if再輸出else;如果執行一次,則先輸出else再輸出if;如果已經進行兩次循環則輸出兩個else。此外t1和t2的start執行先后不定。
保證線程安全的策略
1.Confinement
要求類中方法不能訪問屬性(過于嚴格)。
2.Immutability
使用不可變數據類型和不可變引用,避免多個線程之間的競爭。如果是有益可變性,則需要通過“加鎖”保證線程安全。
3.使用線程安全數據類型
如果必須使用mutable數據類型在多個線程之間共享數據,要使用線程安全的數據類型。一般來說JDK為ADT額外提供一個線程安全的類,但性能受影響。List、Map、Set都是線程不安全的,API提供集合類的包裝,對每個操作都以原子操作進行。執行其上的某個操作是線程安全的,但如果多個操作放在一起,仍然不安全。//即使在線程安全的集合類上,使用iterator也是不安全的。除非使用lock機制。
4.鎖和同步
①程序員負責多線程之間對mutable數據的共享操作,通過同步策略避免多個線程同時訪問數據。使用鎖機制,獲得對數據的獨家更改權,其它線程的訪問被阻塞。
②Lock是Java的內嵌機制,每個對象都有相關聯的lock。
③Lock用以保護共享數據。要實現互斥,則必須使用同一個lock進行保護。
④構造方法默認互斥,不需加鎖。除非必要,否則不加鎖;如果使用,要盡量縮小范圍。因為會給性能帶來極大影響。
⑤對靜態方法進行加鎖,會同時鎖住類的所有對象。
⑥1和4正確。A獲得了list的鎖并不意味著其它對象不能獲取/改變list的元素。對同一個mutable對象的操作,必須在各線程里用synchronized全部保護起來。對于該例子即是將B的兩條語句鎖住。
⑦3和4需要鎖住。
⑧使用lock的條件:任何共享的mutable變量/對象在被讀/寫的時候必須加鎖。涉及到多個mutable變量的時候,它們必須被同一個lock保護(例如開始和結束時間)。
死鎖
1.多個線程競爭lock,相互等待對方釋放lock(必須滿足多個線程使用多個鎖、訪問順序不同)。
2.避免方法:多個線程使用同一順序的lock;用單個lock保護多個對象(粗粒度)。
wait(), notify(), notifyAll()
都是object類的方法。需要在synchronized塊中調用,要求調用對象和lock的對象相同。
o.wait(): 釋放o的鎖(阻塞當前線程),進入到o的等待隊列中。
o.notify(): 喚醒等待隊列的一個線程。
o.notifyAll(): 喚醒等待隊列的所有線程。
總結
以上是生活随笔為你收集整理的软件构造学习笔记-第十四周、十五周的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大麦片的功效与作用、禁忌和食用方法
- 下一篇: 豌豆芽的功效与作用、禁忌和食用方法