多线程与并发

多线程与并发

  • 线程和进程的介绍

线程和进程的介绍

1 进程是资源分配的基本单位,线程是cpu调度的基本单位
2 局部性原理
时间局限性:如果某个数据被访问,那么不久的将来很大概率会被再次访问。
空间局限性:如果某个数据被访问,那么与他相邻的数据很大概率被访问。将这个数据和与之相邻的数据一同缓存(缓存行)。
3 多线程的三大要素
可见性:数据一致性
顺序性:指令重排(解决内存屏障)
多线程与并发_第1张图片
原子性:i++

线程三大核心:
可见性:可见性是指当一个线程修改了共享变量后,其他线程能够立即得知这个修改
顺序性:线程在访问读写共享变量时只能“串行”执行
原子性:原子性是指一个操作是不可中断的,要么全部执行成功,要么全部执行失败。

4 解决方法:
总线锁:任务变成了串行,多线程无意义
缓存锁:MSI MESI FirFly
Modify:修改
Exclusive:独占
Share:共享
Invalid:失效
5 伪共享
6 内存屏障
硬件 LoadBarriers(读屏障) 和 StoreBarriers(写屏障)
JMM:
LoadLoad Barriers
StoreStroreBarriers
LoadStoreBarriers
StoreLoadBarriers:万能屏障

内存模型JMM指令:
JMM规定了lock,unlock,read,load,use,assign,store,write八大指令。
多线程与并发_第2张图片
7JMM
原子性:synchronized
可见性:synchronized,volatile,final
顺序性:synchronized,volatile

CAS算法和ABA问题:
多线程与并发_第3张图片
1 owner:锁的当前持有者
2 cxq(ContentionList):竞争列表,单链表。被挂起线程等待重新竞争锁。monitor通过CAS将ObjectWaiter写入到cxq的头
3 EntryList:候选者列表 双向链表
3.1 EntryList为空,cxq不为空,Owner归还锁unlock.把cxq中数据移到EntryList。并且EntryList的第一个线程置为OnDeck线程。
3.2 cxq自旋达到阈值进入到EntryList中
4 onDeck线程,可以竞争锁的线程
5 waitList:owner主动调用wait(),owner进入到waitList。当其他线程调用notify,那么从waitList移到EntryList
6 recursions 重入计数器
多线程与并发_第4张图片
Lock锁
公平锁:
非公平锁:
AQS:
AQS维护了一个CLH队列双线链表,Lock中的CLH将自旋改为了阻塞。
还一个了一个单链表Condition

线程池
jdk自带的线程池:
SingleThreadExcutor:
CachedThreadPoll:
newFixedThreadPool:

自定义线程
ThreadPoolExecutor
线程池拒绝策略:
多线程与并发_第5张图片

你可能感兴趣的:(1024程序员节)