并发相关知识点
作者:互联网
进程和线程的区别
最新的 进程拥有内存等资源 线程只拥有cpu资源 程序执行的副本–进程 运行的最小单位–线程
java的线程 与 os内核的线程 linux系统中 1:1的映射关系 属于用户-内核 线程 混合
线程拥有cpu资源共享内存文件,切换成本低 Threadlocal的实现类似hash,根据线程id去共享内存hash
并发的三个要素 原子性 有序性 可见性
原子性:cas操作
java层的实现与os层的对接
竞争 临界区
减少竞争:内存屏障Threadlocal 原子操作:cas,tas 互斥:lock
cas在java的实现:Unsafe对接os的指令
aba问题 增加版本号 AtomicMarkedReference(是否被修改)
synchronized 的实现
对于synchornized的实现有几个要点
1、提供加锁、解锁的能力
2、提供线程之间通信的能力
3、提供休眠的能力
每个类都能使用synchronized,使用object都有的monitor,属于c/c++实现的,提供加锁、解锁。
抢占monitor,又被称为内置锁。
monioter提供wait/notify/notifyAll的功能由object代理
提供entryset与waitset实现休眠等待的功能。
对于sychronized的优化锁的升级:
当高并发来临的时候,一个任务的占用的时间可能足够所有的任务完成自旋,为了不浪费cpu资源
设置entryset通过自旋竞争进入等待属于轻量级锁,然后在竞争进入waitset休眠属于重量级锁,
当没有占用的时候设置了偏向锁直接持有锁,即在object设置标志位。
基于AQS的Reentrantlock
trylock超时获取 中断抛出异常
条件变量:condition 提供await signal
提供非阻塞:tryAcquire 阻塞:release/acquire
synchronized与Reentantlock比较:
相同:可重入 线程之间的协作 升级:cas -> 休眠+排队 moniotr:entryset+waitset AQS:CLH队列
不同:ASQ/moniort java/c、c++ interruptexception trylock 跨语句 公平性的可配置
同步器:使得混乱的执行顺序变得同步 变得有序
信号量(生产者-消费者,并发流量控制) ReentrantLock CycliBarrier(分治策略,批量处理)
内部有一个ReentrantLock用于保护计算逻辑,还有一个条件变量用于让线程们在条件变量中休眠
CountDownLatch Phaser Exchanger
可见性:读、写、计算
导致不可见性的原因:并发条件下的分级缓存策略和指令重排
volatile实现可见的原理:阻止指令重排、读屏障-将内存读入缓存、写屏障-从缓存写入内存
happens-befor
双检测单例的写法 if(ref == null) synchronized(Foo.class) if(ref == null)
在执行构造函数的时候可能会发生指令重排:可使用volatile进行修饰 附近所有的都不重排
弱一点的hapens-befor AtomicReference getAcquire/setRelease 保证大致的前后关系
happens-befor:
单机下的语句顺序 monitor volatile Atomic acquire/release Threa.sart->run->join
并发条件下的数据结构:提供有限的缓冲区 ddos就是攻击有限的缓冲区用无用的请求填满
ArrayBlockingQueue 有界
LinkedBlockingQueue 无界
LinkedBlockingDeque 双端
ProrityBlockingQueue 优先级
DelayQueue 延时
LinkedTransferQueue
synchrnousQueue
三类方法:抛异常:add/remove 非阻塞:offer/poll 阻塞:put/take
ArrayBlockingQueue和LinkedBlockingQueue的区别?
add/offer/put的区别?remove/poll/take的区别?
DelayQueue的应用场景是什么?
SynchronousQueue的应用场景是什么?
LinkedTransferQueue和SynchronousQueue有什么异同?
LinkedBlockingDeque和SynchronousQueue工作原理一样吗?
都基于双向(Dual)数据结构。区别:SynchronousQueue可以选择用双向队列或双向栈,FIFO是公平
的,FILO是不公平的。LinkedTransferQueue只有队列的实现。
都继承于BlockingQueue接口。区别:SynchronousQueue的offer方法,类似LinkedTransferQue
ue的tryTransfer方法;LinkedTransferQueue的offer方法,类似传统队列比如ArrayBlockingQ
ueue的offer方法。因此,LinkedTransferQueue同时兼容了双向队列和单向队列。
ArrayBlockingQueue不能够实现没有足够的消费者就阻塞生产者的逻辑。 ArrayBlockingQueue只
能在队列已经填满的情况下阻塞。也就是SynchronousQueue可以用来实现生产者等待消费者接收元
素的逻辑。比如,消息处理场景等待接收方接收消息的场景;再比如线程池中提交任务等待有线程处
理的场景。
线程池技术:
参数
corePoolSize
maxPoolSize
keepaliveTime
ThreadFactory
WorkQueue
Handler
拒绝策略
Abortpolicy 抛异常
Discardpolicy 直接丢弃
Discardoldestpolicy 丢最老的
callerRunPolicy 谁提交谁执行
6种常见的线程池
FixedThreadPool core=max
CachedThreadPool --> synchrnousQueue core=MAx
SchedThreadPool
SingleThradExcutor
SingleThreadScheduledExecutor
ForkJoinPool -->共享队列+独享deque
标签:知识点,并发,队列,offer,SynchronousQueue,线程,相关,LinkedTransferQueue 来源: https://blog.csdn.net/qq_30391619/article/details/120467465