多线程与并发编程
2021-06-21 14:06:57 0 举报
AI智能生成
多线程
作者其他创作
大纲/内容
cpu工作原理
cpu指令结构
控制单元
运算单元
存储单元
cpu缓存结构
三级缓存架构
局部性原理
时间局部性
空间局部性
并发工具
CountDownLatch
Semaphore
使用场景
CyclicBarrier
应用场景
CyclicBarrier和CountDownLatch的区别
并发集合
Map
HashMap
1.7和1.8的区别
结构
1.7
数组+链表
1.8
数组+链表+红黑树
扩容
1.7
多线程头插法扩容可能会形成循环链表
扩容步骤
1.8
尾插法
扩容步骤
红黑树和链表转换
区别总结
ConcurrentHashMap
1.7
1.8
ConcurrentSkipListMap
List
ArrayList
LinkedList
CopyOnWriteArrayList
Set
HashSet
CopyOnWriteArraySet
Collections
synchronizedList
java中的阻塞队列
ArrayBlockingQueue
LinkedBlockingQueue
PriorityBlockingQueue
DelayQueue
SynchronousQueue
LinkedTransferQueue
LinkedBlockingQueue
并发基础
AQS
AbstractQueuedSynchronizer同步器
队列同步器
以下3个方法来 修改同步 状态
getState():获取当前同步状态
setState(int newState):设置当前同步状态
compareAndSetState(int expext,int update):使用CAS设置当前状态,该方法能够保证设置的原子性
同步器可重写的方法基本 为3类
独占式 获取与释放 同步状态
共享式获取与释放不同状态
查询同步队列中的等待线程情况
独占锁
同一时刻只能由一个线程获取到锁,而其他获取锁的线程只能处于同步队列中等待,只有获取锁的线程释放了锁,后继的线程才能获取锁
实现方式
同步队列
独占式同步状态获取与释放
共享式同步状态获取与释放
CAS
Compare And Swap
缺陷
ABA
ABA解决方案
循环时间长 开销大
只能保证一个共享变量的原子操作
线程间通信
volatile和synchronized关键字
等待/通知
使用wait()、notify()和notifyAll()时需要先对调用对象加锁
调用wait()方法后,线程状态由RUNNING变为WAITING,并将当前线程放置到对象的等待队列
notify()或notifyAll()方法调用后,等待线程依旧不会从wait()返回,需要调用notify()或notifyAll的线程释放锁之后,等待的线程才有机会从wait()返回。
notify()方法将等待队列中的一个等待线程从等待队列中移到同步队列中,而notifyAll()方法将等待队列中所有的线程全部移到同步队列,被移动的线程状态由WAITING变为BLOCKING。
从wait()方法返回的前提是获得了调用对象的锁
Thread.join()
ThreadLocal
InheritableThreadLocal
其他
Fork/Join
Fork/Join的设计
分割任务
执行任务合并结果
Disruptor并发框架
内存模型
原子性
解决方案
Atomic类
加锁
可见性
解决方案
volatile
内存屏障
volatile读-写内存语义
加锁
有序性
as-if-serial
解决方案
加锁
happens-before 原则
规则
1. 程序顺序原则,即在一个线程内必须保证语义串行性,也就是说按照代码顺序执行。
2. 锁规则 解锁(unlock)操作必然发生在后续的同一个锁的加锁(lock)之前,也就是说,如果对于一个锁解锁后,再加锁,那么加锁的动作必须在解锁动作之后(同一个锁)。
3. volatile规则 volatile变量的写,先发生于读,这保证了volatile变量的可见性,简单的理解就是,volatile变量在每次被线程访问时,都强迫从主内存中读该变量的值,而当该变量发生变化时,又会强迫将最新的值刷新到主内存,任何时刻,不同的线程总是能够看到该变量的最新值。
4. 线程启动规则 线程的start()方法先于它的每一个动作,即如果线程A在执行线程B的start方法之前修改了共享变量的值,那么当线程B执行start方法时,线程A对共享变量的修改对线程B可见
5. 传递性 A先于B ,B先于C 那么A必然先于C
6. 线程终止规则 线程的所有操作先于线程的终结,Thread.join()方法的作用是等待当前执行的线程终止。假设在线程B终止之前,修改了共享变量,线程A从线程B的join方法成功返回后,线程B对共享变量的修改将对线程A可见。
7. 线程中断规则 对线程 interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过Thread.interrupted()方法检测线程是否中断。
8. 对象终结规则对象的构造函数执行,结束先于finalize()方法
锁
synchronzied
底层原理
Monitor
MonitorEnter
MonitorExit
过程图
对象的内存布局
对象头(Header)
Mark Word
Klass Point
实例数据(Instance Data)
boolean:1byte
byte:1byte
short:2byte
char:2byte
int:4byte
float:4byte
long:8byte
double:8byte
对齐填充(Padding)
结构图
锁的膨胀升级过程
无锁
偏向锁
轻量级锁
重量级锁
锁的mark word结构
锁消除
lock
AQS
CLH
结构
资源共享方式
Exclusive
Share
ReentrantLock
公平锁
非公平锁
实现锁重入
LockSupport
Condition
用法
等待队列
等待
唤醒
结构
原子操作
基本类型
AtomicBoolean
AtomicInteger
AtomicLong
数组
AtomicIntegerArray
AtomicLongArray
AtomicReferenceArray
引用类型
AtomicReference
AtomicReferenceArrayFieldUpdater
原子更新字段类
AtomicIntegerFieldUpdater
AtomicLongFieldUpdater
AtomicStampedReference
java如何实现原子操作
使用循环CAS实现原子操作
锁
线程池
ThreadPoolExecutor
构造参数
corePoolSize
maximumPoolSize
keepAliveTime
TimeUnit
BlockingQueue
ArrayBlockingQueue
LinkedBlockingQuene
SynchronousQuene
priorityBlockingQuene
ThreadFactory
RejectedExecutionHandler
种类
newFixedThreadPool
newSingleThreadExecutor
newCachedThreadPool
ScheduledExecutorService
线程
创建线程的方式
Thread
Runnable
Callable
线程的状态
NEW,新建
RUNNABLE,运行
BLOCKED,阻塞
WAITING,等待
TIMED_WAITING,超时等待
TERMINATED,终结
合理配置线程池
线程池的监控
0 条评论
下一页