针对多线程程序,我们不能单纯的来指出是好还是坏,需要遵循一定的评价标准来规范的指出好在哪里、差在哪里?
其实也就是:
- 安全性和生存性:程序的必要条件;
- 可复用性和性能:提高程序质量条件;
主要标准
有下面四个主要标准:
安全性(Safety):不损坏对象
安全性就是不损坏对象,是程序正常执行的必要条件之一。
对象损坏是指对象的状态和设计者的原意不一致,通常是指对象的字段的值并非预期值。
如果一个类即使被多个线程同时使用,也可以确保安全性,那么这个类就是线程安全类
(Thread Safe)。如集合类中的Vector类是线程安全的,而ArrayList类则是非线程安全的。
生存性(Liveness):必要的处理能够被执行
生存性是指无论什么时候,必要的处理都一定能够被执行。也是程序正常运行的必要条件之一。
需注意,即使对象没有损坏,也不一定代表程序一定好。如程序在运行过程中突然停止,而对象的状态未改变,所以对象的状态就不会出现异常,也就是符合了安全性
条件,但是程序的执行无任何意义,不符合生存性
的条件。
有时候安全性和生存性会互相制约。有时只重视安全性,生存性就会下降。典型代表就是死锁(deadlook)
,即多个线程互相等待对方释放锁的情形。
可复用性(Reusability):类可重复利用
可复用性是指类能够重复利用。是提高程序质量的必要条件。
类如果能作为组件从正常运行的程序中分割出来,那么说明这个类有很高的可复用性。
性能(Performance):能快速、大批量地执行处理
性能是指能快速、大批量地执行处理。也是提高程序质量的必要条件。
影响性能的因素有多种:
吞吐量(throughpt):
指单位时间内完成的处理数量。能完成的处理越多,表示吞吐量越大。响应性(responsiveness):
指从发出请求到收到响应的时间。响应性好即等待时间(latency)短。容量(capacity):
指可以同时进行的处理数量。如服务器能同时处理的客户端数或文件数等。效率(efficiency):
可伸缩性(scalability):
降级(degradation):
有时这些要素之间会相互制约,如提高吞吐量,可能会导致程序的响应性下降。
总结
安全性
和生存性
是程序必备的条件。即既不能损坏对象,也一定要执行必要的处理。
在此基础之上,还需考虑如何提高程序的高可复用性和性能。