⭐️并发实现机制:CPU通过给每个线程分配CPU时间片,一般是几十毫秒
多线程不一定快,是因为线程有创建和上下文切换的开销
那么既然如此,如何减少上下文切换呢?
-
无锁并发编程
锁的使用,会引发上下文切换,可以避免用锁,如将数据的ID按照hash算法取模分段,不同的线程处理不同段的数据。 -
CAS算法
Java的Atomic包使用CAS算法来更新数据,而不需要锁。
对cas算法的讲解详见下面这篇博客
https://www.cnblogs.com/Mainz/p/3546347.html -
使用最少线程
避免创建不必要的线程,大量创建线程会导致大部分线程处于等待状态 -
使用协程
即在一个线程中实现多任务的调度。
?减少上下文切换的实战
1)查看某一个进程里的全部线程是什么状态(发现很多是waiting状态的)
2)查看waiting状态的线程的详细信息,发现大部分属于jboss线程
?什么是jboss线程
3)配置jboss线程池信息,将其最多线程数设置为100
4)重启并重复第一步,查看效果
?死锁
死锁产生的一种可能情况是:一个线程在释放锁的过程中抛出了异常,导致没有释放掉。
⭐️避免死锁的几个方法
1)避免一个线程同时获得多个锁
2)每个锁尽量只锁定一个资源
3)使用定时锁
4)对于数据库锁,还要注意加锁和解锁必须在同一个数据库连接里
?资源限制的挑战
⭐️什么是资源限制
资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源。
硬件资源限制有带宽的上传/下载速度、硬盘读写速度和CPU的处理速度。
软件资源限制有数据库的连接数和socket连接数等。
⭐️引发的问题
在并发编程中,代码执行速度加快的原则是将代码中串行执行的部分编程并发执行,但是如果受限于资源,仍在串行执行,但是由于增加了上下文切换和资源调度的时间,反而会更慢。
⭐️如何解决
对于硬件资源,考虑集群
对于软件资源,考虑复用(如使用连接池将数据库和socket连接复用)