并发编程的出现要源于摩尔定律的失败。
什么是摩尔定律:摩尔定律不是一种客观存在或者经过验证的真理,他只是基于数据观察而推导出来的结论。按照预测的速度,计算能力会按照指数级别的速度增长,不久以后会拥有超强的计算能力,But,2004年,Intel宣布4GHz芯片的计划推迟到2005年,然后在2004年秋季,Intel宣布彻底取消4GHz的计划,也就是说摩尔定律的有效性超过了半个世纪然后歇逼了。
好吧,但是计算机的前辈大拿们没有停下脚步,单核性能不能持续提升,那就用多核来解决。
于是观念就转变成研究多核了,并发也就出现了。
那并发编程有什么优点呢?
- 充分利用多核的计算能力,可以并发计算
- 方便业务拆分,提升系统性能
并发编程优缺点
1.频繁的上下文切换
线程执行是按照CPU分配的时间片执行的,时间非常短,所以CPU通过不断切换线程,让我们觉得是多个线程在同时执行。
但是每次切换,CPU都要记录上一个线程的执行状态,以便后面恢复线程的执行,其实这个是很消耗性能的。
那我们写代码的时候,怎么去优化这个缺陷呢?
- 无锁并发编程:可以参照concurrentHashMap锁分段的思想(现在已经是红黑树实现了),不同的线程处理不同段的数据,这样在多线程竞争的条件下,可以减少上下文切换的时间。
- CAS算法,利用Atomic下使用CAS算法来更新数据,使用了乐观锁,可以有效的减少一部分不必要的锁竞争带来的上下文切换
- 使用最少线程:避免创建不需要的线程,比如任务很少,但是创建了很多的线程,这样会造成大量的线程都处于等待状态
- 协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换
2.线程安全问题
多线程会有以下几个问题:
- 临界区资源问题
- 线程间死锁问题
这个也有优化的办法,具体如下:
- 避免一个线程同时获得多个锁;
- 避免一个线程在锁内部占有多个资源,尽量保证每个锁只占用一个资源;
- 尝试使用定时锁,使用lock.tryLock(timeOut),当超时等待时当前线程不会阻塞;
- 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况