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_线程安全性

线程安全性

一、什么是线程安全?

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

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

 05_指令集和解释器

指令集和解释器

Java虚拟机顾名思义,就是一台虚拟的机器,而字节码(bytecode)就是运行在这台虚拟机器上的机器码。

一、字节码指令

1.1 指令结构

字节码中存放编码后的 Java 虚拟机指令:

  • 每条指令都以一个单字节的操作码(opcode)开头。

  • 由于只使用一字节表示操作码,Java 虚拟机最多只能支持 256 条指令。

到第八版为止,Java 虚拟机规范已经定义了205条指令,操作码分别是0(0x00)202(0xCA)254(0xFE)255(0xFF)

 04_运行时数据区

运行时数据区

一、数据结构

在运行Java程序时,Java虚拟机需要使用内存来存放各式各样的数据。Java虚拟机规范把这些内存区域叫作运行时数据区。

运行时数据区可以分为两类:一类是多线程共享的,另一类则是线程私有的。

  • 多线程共享的运行时数据区需要在Java虚拟机启动时创建好,在Java虚拟机退出时销毁
  • 线程私有的运行时数据区则在创建线程时才创建,线程退出时销毁

 HashMap

HashMap

一、定义

1
2
3
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
}

二、实现

2.1 数据结构

HashMap 的底层数据存储结构是“数组 + 链表 + 红黑树”,红黑树结构是 JDK8 之后进行的优化。