并发编程(五):安全性、活跃性以及性能问题安全性、活跃性以及性能问题

【关于作者】

关于作者,目前在蚂蚁金服搬砖任职,在支付宝营销投放领域工作了多年,目前在专注于内存数据库相关的应用学习,如果你有任何技术交流或大厂内推及面试咨询,都可以从我的个人博客(https://0522-isniceday.top/)联系我

1.安全性问题

概念:线程安全,就是正确性,正确性就是程序按照我们期望的执行

导致线程安全的三个源头:

  1. 可见性
  2. 有序性
  3. 原子性

什么时候才需要注意产生安全性问题呢?

存在共享数据并且该数据会发生变化,简单来说就是多个线程会同时读写同一数据。

竞态条件:程序的正确性依赖于线程执行的顺序

如何解决:锁

2.活跃性问题

活跃性问题:

  1. 死锁
  2. 活锁
  3. 饥饿

2.1.死锁

概念:线程互相等待,并且一直等下去,表现为永久的阻塞

解决方案:

2.2.活锁

概念:线程有时候并没有发生阻塞,但是仍然会执行不下去,这就是“活锁”,举例来说就是线程A、B同时申请资源时候,发现对方也在申请资源,然后两者开始互相谦让资源导致一直等待的问题

解决方案:线程A和线程B分别等待随机的时间再去申请资源,防止又出现同时申请资源的场景

2.3.饥饿

概念:线程因无法访问所需资源而无法执行下去的情况,例如线程优先级低,无法得到CPU资源去执行或者持有锁的线程执行的时间过长

解决方案:

  1. 保证资源充足
  2. 公平的分配资源
  3. 避免持有锁的线程长时间执行

方法1和3场景比较有限,方法2的解决方案主要是公平锁,所谓公平锁,是一种先来后到的方案,线程的等待是有顺序的,排在等待队列前面的线程会优先获得资源

3.性能问题

“锁”的过度使用可能导致串行化的范围过大,这样就不能够发挥多线程的优势了,而我们之所以使用多线程搞并发程序,为的就是提升性能

阿姆达尔(Amdahl)定律,代表了处理器并行运算之后效率提升的能力:

image-20210804220205031

n:核数

p:并行百分比

(1-p):串行百分比,作临界区都是串行的,非临界区都是并行的,用单线程执行临界区的时间/用单线程执行(临界区+非临界区)的时间就是串行百分比

公式里的 n 可以理解为 CPU 的核数,p 可以理解为并行百分比,那(1-p)就是串行百分比了,也就是我们假设的 5%。我们再假设 CPU 的核数(也就是 n)无穷大,那加速比 S 的极限就是 20。也就是说,如果我们的串行率是 5%,那么我们无论采用什么技术,最高也就只能提高 20 倍的性能

所以使用锁的时候一定要关注对性能的影响。 那怎么才能避免锁带来的性能问题呢?这个问题很复杂,Java SDK 并发包里之所以有那么多东西,有很大一部分原因就是要提升在某个特定领域的性能

优化性能的方案有如下这些:

  1. 使用无锁的算法和数据结构:例如线程本地存储 (Thread Local Storage, TLS)、写入时复制 (Copy-on-write)、乐观锁等,还有Java并发包中的原子类也是一种无锁的数据结构,Disruptor 则是一个无锁的内存队列性能都不错
  2. 减少锁的持有时间:为了增加并行度,一定要减少锁的持有时间,尽量使用细粒度的锁。例如Java 并发包里的 ConcurrentHashMap,它使用了所谓分段锁的技术;还可以使用读写锁,也就是读的时候不上锁,写的时候才会互斥

性能方面有如下指标:

  1. 吞吐量:单位时间内能够处理的请求数量。吞吐量越高,性能越好
  2. 延迟:发出请求到收到响应的时间。延迟越小,说明性能越好
  3. 并发量:能够同时处理的请求数量,一般来说随着并发量的增加、延迟也会增加。所以延迟这个指标,一般都会是基于并发量来说的。例如并发量是 1000 的时候,延迟是 50 毫秒
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哈哈张大侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值