多线程与并发编程
2021-06-21 14:06:57 0 举报
AI智能生成
多线程
作者其他创作
大纲/内容
cpu工作原理
cpu指令结构<br>
控制单元
运算单元
存储单元
cpu缓存结构<br>
三级缓存架构
局部性原理
时间局部性
空间局部性
并发工具
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<br>
Set
HashSet
CopyOnWriteArraySet<br>
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<br>
内存屏障
volatile读-写内存语义
加锁
有序性
as-if-serial
解决方案
加锁
happens-before 原则
规则<br>
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<br>
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
结构<br>
资源共享方式
Exclusive
Share
ReentrantLock
公平锁
非公平锁
实现锁重入
LockSupport
Condition
用法<br>
等待队列
等待
唤醒
结构
原子操作
基本类型
AtomicBoolean
AtomicInteger
AtomicLong
数组
AtomicIntegerArray
AtomicLongArray
AtomicReferenceArray
引用类型
AtomicReference
AtomicReferenceArrayFieldUpdater
原子更新字段类
AtomicIntegerFieldUpdater
AtomicLongFieldUpdater
AtomicStampedReference
java如何实现原子操作
使用循环CAS实现原子操作
锁
线程池
ThreadPoolExecutor<br>
构造参数
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 条评论
下一页