多线程编程的优势与风险

多线程编程具有以下优势。

  1. 提高系统的吞吐率。多线程编程使得一个进程中可以有多个并发(即同时进行)的操作。例如,当一个线程因为I/O操作而处于等待时,其他线程任然可以执行其操作。
  2. 提高响应性。在使用多线程编程情况下,对于GUI软件(如桌面应用程序)而言,一个慢的操作(比如从服务器上下载一个大的文件)并不会导致软件的界面出现被“冻住”的现象而无法响应用户其他的操作;对与Web应用程序而言,一个请求慢了并不会影响其他请求处理。
  3. 充分利用多核处理器资源。如今的多核处理器越来越普及,就算是手机这样的消费类设备也普片使用多核处理器。实施恰当的多线程编程有助于我们充分 利用多核处理器资源,从而避免资源浪费。
  4. 最小化对系统资源的使用。一个进程中的多个线程可以共享其所在进程所申请的资源(如内存空间),因此使用多个线程相比于使用多个进程进行编程来说,节约了对系统资源的使用。
  5. 简化程序的结构。线程可以简化复杂应用程序的结构。

多线程编程的问题与风险。

  1. 线程安全问题。多个线程共享数据的时候,如果没有采取相对应的并发访问控制措施,那么就可能产生数据一致性问题,如读取脏数据(过期的数据)、丢失更新(某些线程所做的更新被其他线程所做的更新覆盖过)等。
  2. 线程活性问题。一个线程从其创建到运行结束的整个生命周期会经历若干状态。从单个线程角度来看,RUNNABLE状态是我们所期待的状态。但实际上,代码编写不当可能导致某些线程一直处于等待其他线程释放锁的状态(BLOCKED状态),及产生了死锁(Deadlock)。 例如,线程T1拥有锁L1,并试图去获得锁L2,而此时线程T2拥有锁L2而试图去获得锁L1,这就导致线程T1和T2一直处于等待对方释放锁而一直又得不到锁的状态。当然,一直忙碌的线程也可能会出现问题,他可能面临活锁(Livelock)问题,即一个线程一直在尝试某个操作但就是无法进展,这就好比小猫一直追着自己的尾巴咬却一直咬不到的情形。另外,线程是一种稀缺的计算资源,一个系统拥有的处理器数量相对于该系统中存在的线程数量而言总是少之又少。某些情况下可能出现线程饥饿(Starvation)的问题,即某些线程永远无法获取处理器执行的机会而永远处于RUNNABLE状态的READY子状态。
  3. 上下文切换(Context Switch)处理器从执行一个线程转向执行另外一个线程的时候操作系统所需要做的一个动作被称为上下文切换。由于处理器资源的稀缺性,因此上下文切换可以被看作多线程编程的必然产物,它增加了系统的消耗,不利于系统的吞吐率。
  4. 可靠性。多线程编程一方面可以有利于可靠性,例如某个线程意外提前终止了,但这并不影响其他线程继续其处理。另一方面,线程是进程的一个组件,它总是存在特定的进程中,如果这个进程由于某种原因意外提前终止,比如某个Java进程由于内存泄漏导致Java虚拟机崩溃而意外终止,那么该进程中所有的线程也就随之无法继续运行。因此,从提高软件可靠性的角度来看,某些情况下可能要考虑多进程多线程的编程方式,而非简单的单进程多线程方式。

猜你喜欢

转载自blog.csdn.net/weixin_39938767/article/details/80950595