zoukankan      html  css  js  c++  java
  • 多线程007描述一下线程安全活跃态问题,以及竞态条件

    一线程活跃问题

    1.线程安全的活跃性问题可以分为:死锁、活锁、饥饿。

    活锁:有时线程虽然没有发生阻塞,但是仍然会存在执行不下去的情况,活锁不会阻塞线程,线程会一直重复执行某个相同的操作,并且一直失败重试。

    出现的场景:异步消息队列有可能出现活锁问题,在消息队列的消费端如果没有正确的ack消息,并且执行过程中报错了,就会再次放回消息头,然后再拿来执行,一直循环失败。要解决这个问题,除了正确的ack之外,可以将失败的消息放到延时队列中,等待一段时间再重试。

    2.饥饿:线程因无法访问所需资源而无法执行。饥饿分两种情况,

    第一种情况,其他线程在临界区做了无限循环或者无线等待资源的操作,让其他线程一直拿不到锁,无法进入临界区。这时其他线程就是饥饿状态。

    第二种情况,线程优先级设置不合理,导致部分低优先级的线程一直无法获取到CPU,而进入饥饿状态。

    解决饥饿问题的方案:

    (1)保证资源充足。

    (2)公平分配资源,在并发编程中使用公平锁。

    (3)避免持有锁的线程长时间执行。

    3.死锁:线程在对同一把锁进行竞争的时候,未抢占到锁的线程会等待持有锁的线程释放锁之后继续抢占。

    如果两个或两个以上的线程互相持有堆方将要抢占的锁,互相等待对方先行释放锁就会进入到一个循环等待的过程,这个过程就叫做死锁。

    二竞态条件问题

    1.同一个程序多线程访问同一个资源,如果对资源的访问顺序敏感,就称存在竞态条件,代码区成为临界区。

    与大多数并发错误一样,竞态条件不总是会产生问题,还需要不恰当的执行顺序。

    2.最常见的竞态条件为:

    (1)先检测后执行,执行依赖检测的结果,而检测结果依赖于多个线程的执行时序,而多个线程的执行时序是不确定的,从而导致执行结果出现问题。

    解决方法是,加锁。

    (2)延迟初始化,例如:单例模式的双重检查。

  • 相关阅读:
    前端整体流程
    django安装
    scrapy中出现[scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to 如何解决
    python测试当前代理IP是否有效
    grequests模块
    scrapy中发起post请求
    post请求中的payload解决办法
    SSM配置动态数据源
    前端(十):使用redux管理数据
    前端(九):react生命周期
  • 原文地址:https://www.cnblogs.com/asenyang/p/15568680.html
Copyright © 2011-2022 走看看