进程、线程、多线程?
线程创建?
- thread,不建议使用,因为是单继承局限性
- runable,初学者
- callable,高级(demo)
- 线程池,高级,注意使用场景
线程五大状态?
- 新建->new
- 就绪->start,run,call,只能启动一次死亡后就不能再启动了
- 运行->cpu调度
- 睡眠->sleep
- 死亡->正常|异常结束
常用方法?
- sleep->睡觉
- join->插队阻塞被插的线程
- yield->礼让不一定成功没啥用
- priority->优先级
守护线程?
虚拟机不管守护线程,只管用户线程是否结束
- gc线程
- web项目主线程
线程间通讯(demo)?
- wait
- notify
并发(demo)?
并行?
多个线程同时执行
锁(demo)?分类区别?
- ReentrantReadWriteLock->读写锁,写入同步,读取异步
- synchronized->关键字
- ReentrantLock->公平锁|非公平锁
阻塞队列?
- ArrayBlockingQueue->必须设置容量
抛出异常 | 不抛异常 | 阻塞等待 | 超时等待 |
add | offer | put | offer |
remove | poll->null | take | poll |
element | peek | / | / |
- SynchronousQueue->不可以设置容量默认是1
生产者和消费者(传统的demo)?
虚假唤醒?
多线程下if判断会造成虚假唤醒,要用while替代
生产者和消费者(juc版demo)?
同步监视器精准唤醒(demo)?
8种锁(demo)?
- 谁调用就锁谁
- static锁的是类对象
不安全集合和安全集合?
- ArrayList->变安全
- Vector->简单粗暴,所有的方法加锁
- Collections.synchronizedList(new ArrayList<>())->读写删除加锁,且加锁在代码块上,效率较好,遍历未加锁,可以根据实际业务需求,自行决定是否加锁
- CopyOnWriteArrayList->读未加锁,写使用CAS自旋锁,先复制原数组,修改复制的数组,之后把复制数组重新复制给原地址(当数组过大时,复制效率极低),并发过多,CAS碰撞过多,也会影响性能,读取数据是原数组,所以如果add方法还未执行到setArray方法,读取的数据就是原来的数据
- HashSet(底层是HashMap的key)->变安全
- CopyOnWriteArraySet->同上list
- Collections.synchronizedSet(new HashSet<>())->同上list
- HashMap->变安全
- Collections.synchronizedMap(new HashMap<>())
- ConcurrentHashMap
- xxx
辅助类?
- CountDownLatch->减法计数器(demo)
- CyclicBarrier->加法计数器(demo)
- Semaphore->信号量(demo)
线程池(demo)?
jdk提供的不建议使用,建议自己手动创建(demo)。
-
corePoolSize-核心线程数
-
maximumPoolSize-最大线程数
-
keepAliveTime-(maximumPoolSize-corePoolSize)存活时间
-
unit-存活时间单位
-
workQueue-队列
-
threadFactory-工厂默认不变
-
handler-拒绝策略4种:当线程数大于(maximumPoolSize+workQueue)触发
-
AbortPolicy-直接报错
-
CallerRunsPolicy-交给主线程执行
-
DiscardOldestPolicy-抛弃旧的
-
DiscardPolicy-直接抛弃最后的
-
如何定义最大线程数?
- cpu密集型
- io密集型
函数式接口编程(demo)?
- function
- cosumer
- supplier
- predicat
流式计算?
forkjoin(demo)?工作窃取
大数据处理计算,三种方式处理对比(demo)
异步回调类似于js的Ajax?(completableFuture)研究netty的异步任务
JMM内存模型,volatile关键字?
- 保证线程间可见性
- 不保证原子性->Unsafe类原子类AtomicInteger原理CAS
- 禁止指令重排->内存屏障
单例模式?
彻底搞懂单例模式。