07_04_服务停止

服务停止

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

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

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

 07_03_中断响应

中断响应

在取消任务和中断线程中,中断都起到了很大作用:

  • 取消任务,最合理的方式就是使用中断
  • 中断线程,线程收到中断后作何处理

但是有个问题:

  • 任务和线程都能接收中断请求,那怎么区分?

也就是,中断响应由谁来负责?

 06_任务的执行

任务的执行

一、在线程中执行任务

1.1 串行执行

串行执行,是指所有任务都在单个线程中串行地执行。

1
2
3
4
5
6
7
8
9
class SingleThreadWebServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(80);
while (true) {
Socket connection = serverSocket.accept();
handleRequest(connection);
}
}
}

串行执行,一般来说吞吐率或速响应性都比较差。

 05_基础构建模块

基础构建模块

一、同步容器

  • 同步容器类都是线程安全的,比如 Vector 和 HashTable
  • 实现线程安全的方式是:将它们的状态都封装起来,所有对外接口都是同步方法
  • 对容器状态的访问都串行化,保证每次只有一个线程访问容器
  • 能保证单个操作是线程安全的,但是复合操作是不能保证线程安全的
  • 常见的不安全的复合操作包括:迭代、跳转、条件运算

 04_对象的组合

对象的组合

一、设计线程安全的类

1.1 设计过程

1.1.1 收集对象状态

  • 收集类对象的所有状态
  • 如果对象中引用了其他对象,那么该对象的状态也包括引用对象的状态
  • 如果发布了某个可变对象的引用,那么就不应该算作对象的状态

 03_对象的共享

对象的共享

一、共享对象可能存在的问题?

  • 多个线程同时访问或修改共享对象时,可能会出现冲突,即原子性问题
  • 一个线程修改对象状态后,其他线程未必能够看到发生的变化,即内存可见性

 02_线程安全性

线程安全性

一、什么是线程安全?

  • 当多个线程访问某个类时,这个类始终能表现出正确的行为,就称这个类是线程安全的

  • 线程安全类,一般都封装了必要的同步机制,使用时无需额外进行同步

 管程

管程

一、是什么?

管程,是由一组数据以及定义在这组数据上的操作组成的模块或软件包。

管程的组成:

  • 局部于管程内部的数据说明,对外而言是共享数据
  • 对该数据结构进行操作的一组数据
  • 对局部于管程的共享数据设置初始值的语句

管程的特性: