反射–类加载三个阶段
加载 Loading
JVM将类的class文件读入内存,并为之创建一个java.lang.Class对象。此过程由类加载器完成
连接 Linking
将类的二进制数据合并到JRE中
1. 验证 Verification
对文件进行安全的校验
文件格式是否正确
元数据验证是否正确
符号引用是否正确...
-Xverify:none可以关闭大部分的类验证措施,缩短虚拟机加载时间
2. 准备 Preparation
对静态变量分配内存
默认初始化
3. 解析 Resolution
虚拟机将会把常量池中的符号引用替换为直接引用
初始化 Initialization
JVM负责对类进行初始化,这里主要是指静态成员
真正的执行在类中定义的java代码 静态代码块..
线程并发与并行
并发:同一时刻,多个任务交替执行,单核CPU实现多任务就是并发
并行:同一时刻,多个任务同时执行,多核CPU实现多任务并行
CAS算法
CAS(Compare-And-Swap)是一种硬件对并发的支持 针对多处理器操作而设计的处理器中的一种特殊指令 用于管理对共享数据的并发访问
CAS是一种无锁的非阻塞算法的实现
CAS包含了3个操作数:
内存值:V
预估值:A
新值:B
当且仅当V的值等于A时 CAS通过原子方式用新值B来更新V的值 否则不会执行任何操作
多线程状态转换
新建:线程被创建出来
就绪:具有CPU的执行资格,但是不具有CPU的执行权
运行:具有CPU的执行资格,也具有CPU的执行权
阻塞:不具有CPU的执行资格,也不具有CPU的执行权
死亡:不具有CPU的执行资格,也不具有CPU的执行权
线程池
public class MyTest {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.submit(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread() + "执行AAA");
}
});
executorService.shutdown();
}
}
集合扩容机制
arrayList
无参构造:初始elementData容量为0,第一次添加为10
之后都是1.5倍扩容
vector
底层维护了一个数组
线程安全
无参构造:第一次默认扩容10个
之后都是2倍扩容
linkedList
底层维护了一个双向链表
hashSet
底层是hashMap,map值固定为PRESENT
第一次添加table表扩容到16 之后按扩容因子(0.75)扩容
16*0.75 不管是加在table表还是链表上都(size++)
如:16(12) -> 32(24) -> 64(48)
若一条链表个数达到8个并且table的大小>=64就会进行树化(红黑树)
一条链表个数到8个但table大小没到64,则table表一直2倍扩容直到>=64
linkedHashSet
底层维护了一个hash表+双向链表
每一个节点有before和after属性 这样可以形成双向链表
是hashSet的子类
底层是linkedHashMap,维护了一个数组table+双向链表
第一次添加时,直接将数组table扩容到16,存放的节点类型(LinkedHashMap$Entry)
数组是(HashMap$Node[]) 存放的元素是(LinkedHashMap$Entry)
hashMap
底层维护了Node类型的数组table,默认为null
添加key-val,通过key的hash值得到table的索引。判断该索引处是否有元素,没有直接添加。如果有元素,判断该处的key和准备加入的key是否相同,相同则直接替换val,不相同则需判断是树结构还是链表结构做处理
第一次添加则扩容table容量到16,临界值为12(16*0.75)
之后扩容table为原来的2倍
若一条链表个数达到8个并且table的大小>=64就会进行树化(红黑树)
LinkedList和ArrayList之间互相转换
ArrayList与类LinkedList不能强制数据类型转换。
1.通过构造方法转换
ArrayList arrayList = new ArrayList();
LinkedList linkedList = new LinkedList(arrayList);
LinkedList linkedList = new LinkedList();
ArrayList arrayList = new ArrayList(linkedList);
2.通过list的add方法