1、Java运行时存储空间
1、堆空间(Heap)
- 可以被多个线程共享
- 存储对象,Java虚拟机启动时分配的一段可以动态扩容的内存空间
- 存储类的实例
- 垃圾回收器的工作场所
- 进一步划分:年轻代、年老代
2、栈空间(Stack)
- 线程的私有空间
- 线程创建时分配的固定大小的内存空间
- 局部变量的变量值存储在栈空间,基础类型变量和引用类型变量的变量值直接存储在栈帧空间
3、非堆空间(Non-Heap)
- 可以被多个线程共享
- 存储常量以及类的元数据,Java虚拟机启动时分配的一段可以动态扩容的内存空间
- 类的元数据包括:类的静态变量、类的方法、方法的元数据(名称、参数、返回值)
2、无状态对象
- 定义:一个类的同一个实例被多个线程共享并不会使这些线程存在共享状态,那这个类及其任意一个实例称为无状态对象
- 无状态对象不含任何实例变量,且不包含任何静态变量或者其包含的静态变量都是只读的常量
- 固有的线程安全性
3、并发集合
1、并发集合对象自身支持对其进行线程安全的遍历操作
2、两种遍历方式
- 快照
在Iterator实例被创建的那一刻待遍历对象内部结构的一个只读副本
优点:遍历和更新操作互不影响
缺点:当集合大时创建快照的开销大 - 准实时
不是针对副本进行遍历,但也不借助锁保障线程安全,从而使遍历可以并发进行