序章2 多線程程序的評價標準

【安全性 不損壞對象】

對象損壞是一種比喻,實際上,對象是內存的一種虛擬事物,並不會實際損壞。對象損壞是指對象的狀態和設計者的意願不一致,通常是指對象的字段的值並非預期值。

如果一個類即使被多個線程同時使用,也可確保安全性,那麼這個類就稱爲線程安全類。

例如java.util.Vector類是線程安全的類,java.util.ArrayList是非線程安全的類。

某個線程是線程安全的還是非線程安全的,與這個類的方法是否是synchronized方法無關。

 

【生存性 必要的處理能夠被執行】

生存性是指無論是什麼時候,必要的處理都一定能夠被執行。這也是程序正常運行的必要條件之一。

有時候安全性和生存性會互相制約,有時候只重視安全性,生存性就會下降。最典型的就是死鎖,即多個線程互相等待對方釋放鎖的情形。

 

【可複用性 類可重複利用】

可複用性是指類能夠重複利用。類如果能夠作爲組件從正常運行的軟件中分割出來,那麼就說明這個類有很高等待可複用性。

 

【性能 能快速、大批量地執行處理】

性能是指能快速、大批量地執行處理。

 

【練習題1 請參照本章的評價標準分析一下下列描述】

1.在方法中一概加上synchronized就“好”。

答:【安全性】加上synchronized不會降低安全性,但也不一定會提高安全性。例如,若將應該保護的字段聲明爲public,不管在方法中加上多少synchronized,程序還是欠缺安全性。

【生存性】如果一概加上synchronized,通常會降低生存性。例如,容易引起死鎖。

【性能】如果加了不必要的synchronized,性能(吞吐量)就會降低。這是因爲調用synchronized方法通常比調用非synchronized方法更耗費時間。

 

2.synchronized方法中進入了無限循環,這程序“不好”。

答:【安全性】儘管synchronized方法中是無限循環,但只要循環中執行的處理正確,就不會降低安全性。

【生存性】如果synchronized方法中是無限循環,那麼想要執行該synchronized方法的其他線程就會阻塞,從而降低生存性。

【性能】生存性降低的話,性能(吞吐量)也會跟着降低。

 

3.由於程序錯誤,啓動了100個只是進行無限循環的線程,但這些線程也不過是在循環執行而已,所以還算“好”吧。

答:【安全性】即使有許多隻是正在進行循環的線程,也不會降低安全性。

【生存性】如果僅是有許多正在執行循環的線程,生存性並不會降低。但是,如果線程消耗的內存超過了系統所能提供的內存,那麼就有可能無法啓動必要的進程,從而降低生存性。

【性能】線程需要內存,還會消耗CPU資源,所以會降低性能。

 

4.這個服務器每次只能連接一個客戶端,請將該服務器改“好”一點。

答:【性能】這句話中所謂的“好”是指服務器能夠同時連接多個客戶端。也就是服務器“容量”的問題。

 

5.這個查找程序可真夠“差”的,一旦查找開始,在全部查找完畢之前都無法取消。

答:【性能】這是程序響應性的問題。

 

6.這樣的話,線程A和線程B就都需要互斥處理,這點“不好”。

答:【可複用性】這是類的“可複用性”的問題。

 

【練習題2 如果把線程個數變爲2倍,那麼吞吐量是不是也會變爲2倍呢?】

答:一般不會變爲2倍,原因如下:

1:受到硬件的限制,2倍的線程並不一定可以真正同時運行(併發運行)。另外,這時也可能造成線程切換的額外開銷。

2:所要處理的工作不一定能平均分配給所有的線程。

3:即使沒有硬件的限制,2倍的線程可以併發運行,執行線程的互斥性處理也會造成額外開銷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章