今天看啥  ›  专栏  ›  HaigLee

Java 多线程程序的评价标准

HaigLee  · 简书  ·  · 2020-01-09 23:55

作者: HaigLee
https://www.jianshu.com/u/67ec21fb270d
本文由 HaigLee 发布。未经许可,禁止转载。

一个程序的好与坏需要有一个评判标准,那这个标准是什么呢?下面我们来探讨一下这个问题:

安全性——不损坏对象

所谓安全性(safety)就是不损坏对象。这是程序运行的必要条件之一。

对象的损坏只是一种比喻,实际上,对象是存储上的一种虚拟事物,并不会实际损坏。对象损坏是指对象的状态和设计者的原意不一致,通常指对象的值并非预期的值。

如果一个类即使被多个线程同时使用,也可以确保安全性,那么这个类就称为线程安全(thread-safe)类。由于类库中还存在着非线程安全的类,所以在多线程程序中使用类时一定要特别注意。例如:java.until.Vector类就是线程安全的类,而java.until.ArrayList则是非线程安全的类。一般在API文档中能够查到各个类是否是线程安全的。

生存性——必要的处理能够被执行

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

即使对象没有损坏,也不代表程序就一定好。极端一点说,假如程序在运行过程中突然停止了,这时候,由于处理已经停止,对象的状态就不会发生变化了,所以对象的状态也就不会异常。这虽然符合前面讲的安全性的条件,但无法运行的程序根本没有任何意义。无论是什么时候,必要的处理一定能够被执行——这就是生存性。

有时候,安全性和生存性会互相制约。最典型的示例就是死锁(deadlock),即多个线程互相等待对方释放锁的情形。

可复用性——类可以复制利用

可复用性(reusability)是指类能够复制利用。这虽然不是程序正常运行的必要条件,但却是提高程序质量的必要条件。

类如果能够作为组件从正常运行的软件中分割出来,那么就说明这个类有很高的可复用性。

在编写多线程程序时,如果能够巧妙的将线程的互斥机制和方针隐藏到类中,那这就是一个可复用性高的程序。java.util.concurrent包中就提供了便于多线程编程的可复用性高的程序。

性能——整快速、大批量地执行处理

性能(performance)是指能快速、大批量的执行处理。这也不是程序正常运行的必要条件,但却是提高程序质量时应该考虑的条件。

影响性能的因素有好多种。下面是从Doug Lea 的性能分类中摘录出的主要部分。

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

  • 响应性(responsiveness):是指从发出请求到收到响应的时间。时间越短,响应性也就越好。在GUI程序中,相比于到处理“结束”时的时间,到处理“开始”时的时间更为重要。前者是指实际处理所花费的时间,而后者是到程序开始响应用户所花费的时间。相比于按下按钮后无任何反应,10秒后才提示“处理完毕”这种方式,在按下按钮时应立刻提示“处理开始”这种方式的响应性更高,即便是到处理结束花费的时间多一点也没有任何关系。响应性好也称为等待时间(latency)短。

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

其它的诸如效率(efficiency)、可伸缩性(scalability)、降级(degradation)等,也可作为性能的评价标准。

有时候,这些要素之间是互相制约的。例如,如果要提高吞吐量,那么在很多情况下,程序的响应性就会下降。如果要提高安全性,那么性能就有可能会下降(如吞吐量变小)。

总结

安全性和生存性是必须遵守的标准。在此基础上,考虑如何提高可复用性和性能。

作者: HaigLee
https://www.jianshu.com/u/67ec21fb270d
本文由 HaigLee 发布。未经许可,禁止转载。




原文地址:访问原文地址
快照地址: 访问文章快照