多线程
2024-03-12 11:18:58 2 举报
AI智能生成
多线程学习整理
作者其他创作
大纲/内容
核心线程数
corePoolSize
最大线程数
maximumPoolSize
除过核心线程数之外的线程消亡等待时间
keepAliveTime
线程消亡等待时间单位
unit
任务队列
workQueue
线程工厂
threadFactory
线程数达到最大值,任务队列也饱和时候,如何拒绝新到来的任务(拒绝策略)
RejectedExecutionHandler
默认的拒绝策略就是AbortPolicy。直接抛出异常
AbortPolicy
在任务被拒绝添加后,会调用当前线程池的所在的线程去执行被拒绝的任务
CallerRunsPolicy
直接抛弃被拒绝的任务
DiscardPolicy
直接抛弃任务队列中未执行时间最久的任务
DiscardOldestPolicy
拒绝策略
参数理解
源码理解
创建一个可重用固定线程数的线程池
newFixedThreadPool
可根据需要创建新线程的线程池
newCachedThreadPool
返回一个线程池,只有一个线程
newSingleThreadExecutor
给定一个延迟后,可以运行命令或者定期执行。
newScheduledThreadPool
创建线程种类
ThreadPoolExecutor
Executors
使用
线程池
包括synchronized,可重入锁
悲观锁
无锁,自旋锁,cas
1.从内存中读取原始变量2.进行计算,得到新的值3.使用缓存中的值和原始变量进行比较,如果一致则替换内存中的值,如果不一致则再次读取内存中的值进行计算,直到替换成功
实现原理
cas
cas底层逻辑,判断是否为多核处理器,如果是多核处理器,则进行lock cmpxhp操作,直接操作os
cas操作本身就是原子性?
对修改变量进行添加版本控制,每次修改,版本控制进行+1
cas ABA问题
问答
乐观锁
偏向锁-->轻量级锁-->重量级锁 (偏向锁和重量级锁都是用户态,重量级锁属于内核态)
锁升级流程
偏向锁如果有一个线程竞争就升级为轻量级锁
轻量级锁如果有线程自旋超过10次就升级为重量级锁或者自旋线程数超过cpu核数一半(1.6之后由jvm控制)
锁升级图片
锁升级过程
锁升级
自旋锁是消耗CPU资源,如果锁时间较长或者自旋线程多,CPU会被大量消耗,重量级锁有等待队列,所有拿不到锁的线程进入队列等待,不需要消耗CPU
为什么有自旋锁还需要升级为重量级锁?
不一定,在明知道有多线程竞争条件下,偏向锁肯定会涉及到锁撤销,这时候直接使用自旋锁
偏向锁是否一定比自旋锁效率高?
JVM启动过程,会有很多线程竞争,所以默认情况时不打开偏向锁,偏向锁默认启动时间延迟4秒
锁
在计算机中,我们把一个任务成为一个进程
进程
在一个进程中会存在一个或多个子任务,我们把种子任务成为一个线程
线程
概念
继承Thread
实现Runnable方式
实现Callable
lambda表达式
线程池方式
线程的创建
NEW
RUNNABLE
TERMINATED
BLOCKED
WAITING
TIME_WAITING
线程的状态
线程状态变迁图
start() 启动一个线程
wait() 等待一个线程 notify() 通知阻塞线程继续执行
join() 在A线程调用B.join()方法,是A线程等待B线程结束,然后再继续执行A线程的方法
wait(time) 等待一定的时间,然后继续执行线程方法
sleep(time) 等待一定的时间,然后继续执行线程方法
LockSupport.park() 等待一个线程
LockSupport.unpark(Thread) 唤醒一个线程
线程状态转换方法
● sleep是Thread类静态方法--wait是Object类方法● sleep常用于线程暂停---wait常用于线程间交互● sleep()不释放锁,wait()释放锁● sleep()方法指定一段时间睡眠,线程自动苏醒 wait()方法被调用后可以通过notify() notifyAll()方法进行调用
wait()和Sleep() 区别
线程状态转换
主要设置线程标志位,可以使用Interrupter优雅停止线程执行。Interrupter 打断一个线程
Interrupter
线程中断
一个或多个操作要么全部执行成功要么全部执行失败
原子性
程序执行的顺序按照代码的先后顺序执行
有序性
一个线程对共享变量的修改,另外一个线程能够立刻看到
可见性
三大特性
synchronized: 具有原子性和可见性
volatile: 具有可见性
sync和volatile都不能保证指令的重排
sync和volatile
从缓存读取内容时按照按照缓存行进行读取,多个线程对于修改同一处缓存行内容,通过缓存一致性协议进行同步
特性
MESI是缓存一致性实现的一种,当一个线程修改了一个变量之后,会将这个变量写入缓存,同时将其他线程使用的该变量置为无效
MESI
缓存一致性协议
并发特性
多线程
0 条评论
下一页