Contents
  1. 1. 多线程的复习
    1. 1.1. hashmap与chm
    2. 1.2. reentranlock
    3. 1.3. AQS
    4. 1.4. volatile
    5. 1.5. 线程池
    6. 1.6. 死锁的四大条件

多线程的复习

hashmap与chm

扩容因子 0.75

数组+链表 或者数组+红黑树

什么时候转红黑树?

1.链表长度大于8的时候

2.数组长度大于64

红黑树在节点小于6时会变成链表

chm

cas、synchronize

1.7链表+数组 头插法-死循环

1.8链表+数组+红黑树 64扩容 尾插法

jdk1.8取消了重复锁,使用synchronize

reentranlock

1.aqs里面有一个volitale修饰的stat字段,标记有没有抢到锁,如果大于1,那么就有,并且代表重复次数

2.其他获取锁的线程,获取锁失败,那么就会进去aqs里面的一个等待队列

3.假如等待队列后,自旋获取锁,如果获取不到锁,进行park

4.如果获取到锁的线程执行完毕,必须手动调用unlock,unlock把state赋值为0,这是所有线程重新来抢占锁

5.对新的

AQS

1.作用,是什么

2.那些数据结构,比如state,node clh队列

3.对外暴露了一些api,reales lock trylock

4.cas操作

volatile

保证了可见,有序性

dcl需要volatile吗?为什么需要

线程池

为什么要用线程池?

管理线程,防止无休止的创建

线程池怎么用的,参数怎么配的?

int corepoolsize 核心线程数

int maximumpoolsize 最大线程数

long keepalivetime 时间

TimeUnit unit 时间单位

BlockingQueue workQueue 阻塞队列

ThreadFactory threadFactory 创建线程的工厂

RejectedWxecutionHandler handler 如果都满了,队列满了,最大线程数满了,拒绝策略

1.执行线程。已有线程数小于核心线程数,会通过worker里的thread.start开启线程

2.这个线程会执行run方法,run方法里面自选调用传进来

3.run不为空都会执行第二步,run还会被阻塞队列获取,如果阻塞队列不为空,那么线程一直在执行

4.如果阻塞队列为空,如果有线程需要回收,会根据keepAliveTime与unit来进行poll,到时间就回收,否则take

5.需要回收的条件:1.线程数大于核心线程 2.设置allowCreThreadTimeOut=true

死锁的四大条件

1.互斥

2.持有等待

3.不可抢占

4.循环等待

Contents
  1. 1. 多线程的复习
    1. 1.1. hashmap与chm
    2. 1.2. reentranlock
    3. 1.3. AQS
    4. 1.4. volatile
    5. 1.5. 线程池
    6. 1.6. 死锁的四大条件