14_条件队列

条件队列

一、状态依赖性管理

1.1、前提条件

类中一般有很多依赖于状态的方法,只有满足某些条件时才能正常执行。

比如说,在有界队列中的方法:

  • put 方法调用前,必须满足 !isFull() 条件
  • take 方法调用前,必须满足 !isEmpty() 条件

!isFull()!isEmpty() 这种被操作依赖的状态条件,称为前提条件。

 12_并发程序测试

并发程序测试

一、并发程序测试

1.1 并发测试的挑战

  • 潜在错误的发生具有不确定性,是随机的

1.2 并发测试的类型

1.2.1 安全性测试

  • 安全性:不发生任何错误的行为
  • 安全性测试:通常采用测试不变性条件和后验条件的形式,即判断某个类的行为在并发测试下,其状态是否与其规范一致

 10_活跃性问题

活跃性问题

一、死锁

1.1 死锁条件

  • 互斥:资源是互斥的,只能被一个线程持有
  • 占用且等待:线程占有一些资源后,在等待其他资源,等待过程中不会释放自己已占用的资源
  • 不可剥夺:不可以强行剥夺已被线程占有的资源
  • 循环等待:占用资源的线程在循环等待其他占用资源的线程释放资源

 08_01_线程池的使用

线程池的使用

一、默认线程池的弊端

并非所有任务都能适用于默认的执行策略,比如:

  • 依赖性任务
  • 线程封闭的任务
  • 长时间运行的任务
  • 使用线程本地变量的任务

这类任务往往需要指定特定的执行策略,否则可能会产生活跃性问题。

 07_05_程序关闭

程序关闭

JVM 既可以正常关闭,也可以强行关闭。

正常关闭方式有:

  • 最后一个“正常(非守护)”线程结束时
  • 调用了 System.exit() 方法
  • 通过其他特定于平台的方法(比如发送 SIGNAL 信号,或键入 CRTL + C)

 07_04_服务停止

服务停止

应用程序中通常会创建拥有多个线程的服务,比如线程池。

一般来说,服务的生命周期基本都比线程的生命周期要长。

当要停止服务时,服务拥有的这些线程也需要同时结束,所以服务应该要提供相应的生命周期方法,比如 shutdown()shutdownNow() 这样的。