多线程与高并发

多线程与高并发

volatile

  1. 保证对象的可见性,缓存一致性协议
  2. 防止指令重排序,添加内存屏障,JVM的内存屏障,在读前后加屏障loadload;loadstore;,在写的前后加屏障storestore;storeload;,最终底层调用操作系统的内存屏障
  3. 修饰引用类型,意义不大,引用指向的对象的值改变了,引用不变,别的线程也观察不到

synchronized

  1. 锁的是对象,尽量不要用String,Integer,Long对象做为锁对象
  2. 锁升级过程,首先第一个线程来拿这把锁的时候此时是偏向锁,只记录该线程ID;再有别的线程来拿这把锁的时候升级为自旋锁,该线程转圈,循环拿锁10次,此时是消耗CPU的,用户态,若循环结束后没拿到锁,则升级为重量级锁,OS级别,进入等待队列,不消耗CPU
  3. notify(),唤醒别的线程让其继续执行,不能释放锁,调用此方法之后,也得等该线程释放锁,才能生效
  4. wait()调用该方法之后,线程进入等待队列,该方法会释放锁

cas (自旋)

m=0
m++
cas(期望值,更新值){
for循环{
if m==期望值 m=更新值


在判断是否等于期望值的期间不会有别的线程修改了m的值,CPU级别保证cas原子性

atomic:
synchronized:
longadder :内部用了分段锁

Reentrantlock

  1. 底层cas
  2. 可以trylock,试着拿锁的结果可做相应处理
  3. 可设置公平锁
  4. condition可以设置不同的等待队列,在多个生产者和消费者之间,可以做到生产者只唤醒消费者线程队列,消费者只唤醒生产者线程队列

countdownlanch

. countdown()线程结束时调用逐渐递减
. await方法,即当减为0时才会继续往下执行代码,否则就一直等着

cyclicbarrier

循环栅栏,有两个参数(阈值,实现方法),当等待线程达到阈值之后执行实现方法,达不到阈值就等待

Phaser

相当于很多个栅栏,
arriveandawaitadvance()等待进入下一个阶段
arriveandderegister()从phaser中解除注册,不再参与后续流程
bulkregister()给phaser注册线程数
onadvance()当达到阈值,栅栏被推倒,自动执行该方法

readwritelock

读写锁,读锁是共享锁,也就是读的线程之间共享,可以并发执行,写的线程等待;写锁是排它锁互斥锁,只有一个写线程执行完其他线程才能执行

semaphore

信号量,多用于限流,即保证最多有设定值的线程执行
acquire()阻塞的,取得信号量即拿锁,得不到信号,就一直阻塞在此,当调用该方法之后,semaphore信号量减1
release()释放信号量,执行该方法之后,信号量被释放

exchanger

交换器,线程之间交换数据使用
exchange()该方法是阻塞的,执行到该方法的时候等待另一个线程执行该方法并完成交换,两个线程才会继续往下执行

locksupport

park()调用此方法时,线程阻塞,停在这里
unpark(t)调用此方法时,解锁t线程,让其继续执行,此方法可以在park()调用以前掉用

threadlocal

当前线程独有的,
set()将对象放进当前线程中的map,get()将对象从当前线程中的map中取出
用途:声明式事务,保证同一个数据库connection
用完之后手工remove掉,防止内存泄露

引用类型

强引用:普通的引用,像Object o = new Object(),被强引用指向的对象不会被回收
软引用:只有在堆内存满了之后才会被回收,new softreference<>()只要,多用于缓存,
弱引用:只要遭遇垃圾回收,弱引用指向的对象就会被回收,如new weakreference<>(),一般用在容器中,如threadlocal ,当一个强引用和弱引用同时指向一个对象,当强引用消失时,该对象就该被回收

虚引用:new phantomreference<>(new Object(),new referencequeue())
有一个虚引用指向object,同时传入一个队列,当对象被回收时,会往队列里存一个值,此时你就知道该对象被回收了,用于管理堆外内存,直接内存,发现队列有值时可以手动去清理堆外内存

线程池

threadpoolexecutor

forkjoinpool

分解汇总的任务
用很少的线程可以执行很多的任务(子任务)tpe 做不到先执行子任务
cpu密集型

signlethreadexecutor

为什么要用单线程的线程池?
任务队列,而且有完整的线程生命周期管理

cached vs fixed

schedule定时任务线程池

concurrent 和 parallel

并行是指任务执行,并发是指任务提交,并行是并发的子集

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值