长沙java培训
达内长沙芙蓉路中心

18487146383

热门课程

达内长沙java培训详解:活跃度(Liveness)

  • 时间:2016-09-21
  • 发布:长沙Java培训
  • 来源:码农网

一个并行应用程序的及时执行能力被称为它的活跃度(liveness)。达内长沙java培训将介绍最常见的一种活跃度的问题——死锁,以及另外两个活跃度的问题——饥饿和活锁。

死锁(Deadlock)

死锁是指两个或两个以上的线程永远被阻塞,一直等待对方的资源。

下面达内长沙java培训举例说明:

Alphonse和Gaston是朋友,都很有礼貌。礼貌的一个严格的规则是,当你给一个朋友鞠躬时,你必须保持鞠躬,直到你的朋友鞠躬回给你。不幸的是,这条规则有个缺陷,那就是如果两个朋友同一时间向对方鞠躬,那就永远不会完了。

当他们尝试调用bowBack两个线程将被阻塞。无论是哪个线程永远不会结束,因为每个线程都在等待对方鞠躬。这就是死锁了。

饥饿和活锁(Starvation and Livelock)

饥饿和活锁虽比死锁问题稍微不常见点,但这些是在并发软件种每一个设计师仍然可能会遇到的问题。

饥饿(Starvation)

饥饿描述了这样一个情况,一个线程不能获得定期访问共享资源,于是无法继续执行。这种情况一般出现在共享资源被某些“贪婪”线程占用,而导致资源长时间不被其他线程可用。例如,假设一个对象提供一个同步的方法,往往需要很长时间返回。如果一个线程频繁调用该方法,其他线程若也需要频繁的同步访问同一个对象通常会被阻塞。

活锁(Livelock)

一个线程常常处于响应另一个线程的动作,如果其他线程也常常处于该线程的动作,那么就可能出现活锁。与死锁、活锁的线程一样,程序无法进一步执行。然而,线程是不会阻塞的,他们只是会忙于应对彼此的恢复工作。现实中的例子是,两人面对面试图通过一条走廊: Alphonse移动到他的左则让路给Gaston ,而Gaston移动到他的右侧想让Alphonse过去,两个人同时让路,但其实两人都挡住了对方没办法过去,他们仍然彼此阻塞。

上一篇:达内长沙java培训详解:Guarded Blocks
下一篇:达内长沙java培训详解:进程和线程

达内长沙Java培训教你阅读GC日志

spring注入配置文件属性到java类

Java中Vector和ArrayList的区别

达内长沙Java培训详解volatile关键字

选择城市和中心
贵州省

广西省

海南省

扫一扫

了解更多干货