【多线程和锁】

1.多线程使用场景

主要用在我们的批量存入和多路召回中,需要对数据进行一个并行处理

2.锁

2.1 Synchronized

本质上是通过monitor对对象进行监控,内部

onwner:负责指向持有对象的线程
EntryList:代表进入的线程
WaitList:代表等待的线程

同步对象和同步代码块不同之处是:对对象通过设置access_flags的ACC_SYNCHRONIZED标志位来实现,而同步代码块则通过monitorenter和monitorexit实现

2.1.1 锁升级

JVM 使用了锁升级的优化方式,就是先使用偏向锁优先同一线程然后再次获取锁,如果失败,就升级为 CAS 轻量级锁,如果失败就会短暂自旋,防止线程被系统挂起。最后如果以上都失败就升级为重量级锁。

2.2 AQS也叫队列同步器
state:线程是否被占用,0不占用;1占用
Node:同步等待队列
Condition:条件等待队列,可以有多个
2.2.1 ReentrantLock

内部有公平锁和非公平锁两种实现,差别就在于新来的线程是否比已经在同步队列中的等待线程更早获得锁。

2.2.2 CountDownLatch

内部是通过实现一个AQS的同步队列实现的,在初始化创建CountDownLatch时,会传入参数state,代表剩余计数的次数,每次有线程执行完成会执行一次countDown即state减1,直到state为0时,当前线程回去唤醒阻塞队列里的所有线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值