【安全性 不損壞對象】
對象損壞是一種比喻,實際上,對象是內存的一種虛擬事物,並不會實際損壞。對象損壞是指對象的狀態和設計者的意願不一致,通常是指對象的字段的值並非預期值。
如果一個類即使被多個線程同時使用,也可確保安全性,那麼這個類就稱爲線程安全類。
例如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倍的線程可以併發運行,執行線程的互斥性處理也會造成額外開銷。