并发与并行、同步与异步、阻塞与非阻塞得解释

一、同步与异步
        同步和异步通常用来形容一次方法调用。同步方法调用一旦开始,调用者
    必须等到方法调用返回后,才能继续后续的行为。异步方法调用更像一个消息
    传递,一旦开始,方法调用就会立即返回,调用者可以继续后续的操作。而异
    步方法通常会在另外一个线程中真实地执行。整个过程,不会阻碍调用者的工
    作。对于调用者来说,异步调用似乎是一瞬间就完成的。如果异步调用需要返
    回结果,那么当这个异步调用真实完成时,则会通知调用者。


二、并发与并行
        并发和并行是两个非常容易混淆的概念。他们都可以表示两个或者多个任
    务一起执行,但是偏重点不同。并发偏重于多个任务交替执行,而多个任务之
    间有可能还是串行的。二并行是真正意义上的同时执行。
        严格意义上来说,并行的多个任务是真实的同时执行,而对于并发来说,
    这个过程只是交替的,一会运行任务A,一会执行任务B,系统会不停地在两者
    之间切换。但对于外部观察者来说,即使多个任务之间是串行并发的,也会造
    成多任务间是并行执行的错觉。


三、阻塞与非阻塞
        阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临
    界区资源,那么其他所有需要这个资源的线程就必须在这个临界区中进行等待
    等待会导致线程挂起,这种情况就是阻塞。此时,如果占用资源的线程一直不
    愿意释放资源,那么其他所有阻塞在这个临界区上的线程都不能工作。
        非阻塞的意思与之相反,它强调没有一个线程可以妨碍其他线程执行,所
    有的线程都会尝试不断前向执行。


四、死锁、饥饿与活锁
        死锁、饥饿和活锁都属于多线程的活跃性问题,如果发现上述几种情况,
    那么相关线程就不在活跃,也就是说它可能很难再继续往下执行了。
        死锁应该是最糟糕的一种情况了(当然其他情况也好不到哪里去)。
        饥饿是指某一个或者多个线程因为种种原因无法获得所需要的资源,导致
    一致无法执行,比如它的线程优先级可能太低,而高优先级的线程不断抢占它
    需要的资源,导致低优先级线程无法工作。
        活锁是一种非常有趣的情况,比如两个线程同时发生时,会进行谦让,主
    动将资源释放给他人使用,那么就会出现资源不断在两个线程中跳动,而没有
    一个线程可以同时拿到所有资源而正常执行。


五、并发级别
        由于临界区的存在,多线程之间的并发必须受到控制。根据控制并发的策
    略,我们可以把并发的级别进行分类,大致上可以分为阻塞、无饥饿、无障碍
    、无锁、无等待几种。
        1、阻塞
            一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继
        续执行。当我们使用synchronized关键字,或者重入锁时,我们得到的就
        是阻塞的线程。
            无论是synchronized或者重入锁,都会试图在执行后续代码前,得到
        临界区的锁,如果得不到,线程就会被挂起等待,知道占有了所需资源为
        止。
        2、无饥饿
            如果线程之间是有优先级的,那么线程调度的时候总是会倾向于满足
        高优先级的线程。也就是说,对于同一个资源的分配,是不公平的。对于
        非公平的锁来说,系统允许高优先级的线程插队。这样有可能导致低优先
        级的线程产生饥饿。但如果锁是公平的,满足先来后到,那么饥饿就不会
        产生,不管新来的线程优先级有多高,要想获取资源就必须排队,那么所
        有的线程都有机会执行。
        3、无障碍
            无障碍是一种最弱的非阻塞调度。两个线程如果是无障碍的执行,那
        么他们不会因为临界区的问题导致一方被挂起。换言之,大家都可以大摇
        大摆的进入临界区。如果大家一起修改共享数据,把数据该坏了怎么办呢?
        对于无障碍的线程来说,一旦检测到这种情况,他就会立即对自己所做的
        修改进行回滚,确保数据安全。但如果没有数据竞争发生,那么线程就可
        以顺利完成自己的工作,走出临界区。
        4、无锁
            无锁的并行都是无障碍的。在无锁的情况下,所有的线程都能尝试对
        临界区进行访问,但不同的是,无锁的并发保证必然有一个线程能够在有
        限步内完成操作离开临界区。
            在无锁的调用中,一个典型的特点就是可能会包含一个无穷的循环。
        在这个循环汇总,线程会不断尝试修改共享变量。如果没有冲突修改成功,
        那么程序退出。否则继续尝试。但无论如何,无锁的并行总能保证有一个
        线程是可以胜出的。不至于全军覆没。至于临界区中竞争失败的线程,他
        们则必须不断尝试,直到自己获胜。
        5、无等待
            无锁只要求有一个线程可以在有限步内完成操作,而无等待则在无锁
        的基础上更进一步进行扩展。他要求所有的线程都必须在有限步内完成,
        这样就不会引起饥饿的问题。如果限制这个步骤上限,还可以进一步分解
        为有界无等待和线程数无光的无等待几种,他们之间的区别只是对循环次
        数的限制不同。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值