1、频繁的上下文切换
时间片是CPU分配给各个线程的时间,因为时间非常短,所以CPU不断通过切换线程,让我们 觉得多个线程是同时执行的,时间片一般是几十毫秒。而每次切换时,需要保存当前的状态起 来,以便能够进行恢复先前状态,而这个切换时非常损耗性能,过于频繁反而无法发挥出多线 程编程的优势。
解决办法
1、 无锁并发编程:可以参照ConcurrentHashMap锁分段的思想,不同线程处理不同段的数据, 这样在多线程竞争的条件下,可以减少上下文切换的时间
2、 CAS算法:利用Atomic下使用CAS算法来更新数据,使用了乐观锁,可以有效的减少一 部分不必要的锁竞争带来的
3、 使用最少线程:避免创建不必要的线程,比如任务很少,但创建了很多线程,这会造成大 部分线程都处于等待状态
4、 协程:在单线程中实现多任务的调度,并在单线程中维持多个任务间的切换
2、线程安全
死锁
两个线程Threadl (拥有LOCK1,需要LOCK2)和Thread2 (拥有L0CK2,需要L0CK1)它们分别 占有各自需要的锁,但又得不到各自需要的锁,就会无止的等待下去,造成了死锁
解决办法
1、 避免一个线程持有多个锁
2、 避免一个线程在锁内部占用多个资源,尽量保证一个锁占用一个资源
3、 尝试使用定时锁,使用lock.tryLock(timeOut),当超时等待时当前线程不会阻塞
4、 对于数据库锁,加锁和解锁必须在同一个连接里,否则会出现解锁失败的情况

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.