针对多线程程序,我们不能单纯的来指出是好还是坏,需要遵循一定的评价标准来规范的指出好在哪里、差在哪里?

其实也就是:

  • 安全性和生存性:程序的必要条件;
  • 可复用性和性能:提高程序质量条件;

主要标准

有下面四个主要标准:

安全性(Safety):不损坏对象

安全性就是不损坏对象,是程序正常执行的必要条件之一。
对象损坏是指对象的状态和设计者的原意不一致,通常是指对象的字段的值并非预期值
如果一个类即使被多个线程同时使用,也可以确保安全性,那么这个类就是线程安全类(Thread Safe)。如集合类中的Vector类是线程安全的,而ArrayList类则是非线程安全的。

生存性(Liveness):必要的处理能够被执行

生存性是指无论什么时候,必要的处理都一定能够被执行。也是程序正常运行的必要条件之一。

需注意,即使对象没有损坏,也不一定代表程序一定好。如程序在运行过程中突然停止,而对象的状态未改变,所以对象的状态就不会出现异常,也就是符合了安全性条件,但是程序的执行无任何意义,不符合生存性的条件。

有时候安全性和生存性会互相制约。有时只重视安全性,生存性就会下降。典型代表就是死锁(deadlook)即多个线程互相等待对方释放锁的情形。

可复用性(Reusability):类可重复利用

可复用性是指类能够重复利用。是提高程序质量的必要条件。
类如果能作为组件从正常运行的程序中分割出来,那么说明这个类有很高的可复用性。

性能(Performance):能快速、大批量地执行处理

性能是指能快速、大批量地执行处理。也是提高程序质量的必要条件。

影响性能的因素有多种:

  • 吞吐量(throughpt):
    指单位时间内完成的处理数量。能完成的处理越多,表示吞吐量越大。

  • 响应性(responsiveness):
    指从发出请求到收到响应的时间。响应性好即等待时间(latency)短。

  • 容量(capacity):
    指可以同时进行的处理数量。如服务器能同时处理的客户端数或文件数等。

  • 效率(efficiency):

  • 可伸缩性(scalability):

  • 降级(degradation):

有时这些要素之间会相互制约,如提高吞吐量,可能会导致程序的响应性下降。

总结

安全性生存性是程序必备的条件。即既不能损坏对象,也一定要执行必要的处理。
在此基础之上,还需考虑如何提高程序的高可复用性和性能。

评论