并发编程1:并发编程的起源和优缺点

并发编程的出现要源于摩尔定律的失败。

什么是摩尔定律:摩尔定律不是一种客观存在或者经过验证的真理,他只是基于数据观察而推导出来的结论。按照预测的速度,计算能力会按照指数级别的速度增长,不久以后会拥有超强的计算能力,But,2004年,Intel宣布4GHz芯片的计划推迟到2005年,然后在2004年秋季,Intel宣布彻底取消4GHz的计划,也就是说摩尔定律的有效性超过了半个世纪然后歇逼了。

好吧,但是计算机的前辈大拿们没有停下脚步,单核性能不能持续提升,那就用多核来解决。

于是观念就转变成研究多核了,并发也就出现了。

那并发编程有什么优点呢?

  • 充分利用多核的计算能力,可以并发计算
  • 方便业务拆分,提升系统性能

 

并发编程优缺点

1.频繁的上下文切换

线程执行是按照CPU分配的时间片执行的,时间非常短,所以CPU通过不断切换线程,让我们觉得是多个线程在同时执行。

但是每次切换,CPU都要记录上一个线程的执行状态,以便后面恢复线程的执行,其实这个是很消耗性能的。

 

那我们写代码的时候,怎么去优化这个缺陷呢?

  • 无锁并发编程:可以参照concurrentHashMap锁分段的思想(现在已经是红黑树实现了),不同的线程处理不同段的数据,这样在多线程竞争的条件下,可以减少上下文切换的时间。
  • CAS算法,利用Atomic下使用CAS算法来更新数据,使用了乐观锁,可以有效的减少一部分不必要的锁竞争带来的上下文切换
  • 使用最少线程:避免创建不需要的线程,比如任务很少,但是创建了很多的线程,这样会造成大量的线程都处于等待状态
  • 协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换

 

2.线程安全问题

多线程会有以下几个问题:

  • 临界区资源问题
  • 线程间死锁问题

这个也有优化的办法,具体如下:

  1. 避免一个线程同时获得多个锁;
  2. 避免一个线程在锁内部占有多个资源,尽量保证每个锁只占用一个资源;
  3. 尝试使用定时锁,使用lock.tryLock(timeOut),当超时等待时当前线程不会阻塞;
  4. 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值