资讯专栏INFORMATION COLUMN

Java™ 教程(并发活性)

KaltZK / 2951人阅读

并发活性

并发应用程序及时执行的能力被称为其活性,本节描述了最常见的活性问题,死锁,并继续简要描述其他两个活性问题,饥饿和活锁。

死锁

死锁描述了两个或多个线程永远被阻塞,等待彼此的情况,这是一个例子。

Alphonse和Gaston是朋友,是礼貌的忠实信徒,礼貌的一个严格规则是,当你向朋友鞠躬时,你必须一直鞠躬,直到你的朋友有机会还礼,不幸的是,这条规则没有考虑到两个朋友可能同时互相鞠躬的可能性,这个示例应用程序Deadlock模拟了这种可能性:

public class Deadlock {
    static class Friend {
        private final String name;
        public Friend(String name) {
            this.name = name;
        }
        public String getName() {
            return this.name;
        }
        public synchronized void bow(Friend bower) {
            System.out.format("%s: %s"
                + "  has bowed to me!%n", 
                this.name, bower.getName());
            bower.bowBack(this);
        }
        public synchronized void bowBack(Friend bower) {
            System.out.format("%s: %s"
                + " has bowed back to me!%n",
                this.name, bower.getName());
        }
    }

    public static void main(String[] args) {
        final Friend alphonse =
            new Friend("Alphonse");
        final Friend gaston =
            new Friend("Gaston");
        new Thread(new Runnable() {
            public void run() { alphonse.bow(gaston); }
        }).start();
        new Thread(new Runnable() {
            public void run() { gaston.bow(alphonse); }
        }).start();
    }
}

Deadlock运行时,两个线程在尝试调用bowBack时极有可能会阻塞,两个阻塞都不会结束,因为每个线程都在等待另一个线程退出bow

饥饿和活锁

饥饿和活锁问题远没有死锁常见,但仍然是每个并发软件设计人员可能遇到的问题。

饥饿

饥饿描述了一种情况,即线程无法获得对共享资源的定期访问,并且无法取得进展,当“贪婪”线程使共享资源长时间不可用时会发生这种情况。例如,假设一个对象提供了一个通常需要很长时间才能返回的同步方法,如果一个线程频繁地调用此方法,其他也需要频繁同步访问同一对象的线程将经常被阻塞。

活锁

一个线程经常响应另一个线程的操作,如果另一个线程的操作也是对另一个线程的操作的响应,则可能导致活锁。与死锁一样,活锁线程无法取得进一步进展,但是,线程不会被阻塞 — 它们只是太忙于回应彼此而无法继续工作。这相当于两个试图在走廊里互相通过的人:Alphonse向左移动让Gaston通过,而Gaston向右移动让Alphonse通过,看到他们仍然互相阻塞,Alphone向右移动,而Gaston向左移动,他们还在互相阻塞,所以...。

上一篇:同步 下一篇:守护阻塞

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73034.html

相关文章

  • Java教程(同步)

    同步 线程主要通过共享对字段和引用对象的引用字段的访问来进行通信,这种通信形式非常有效,但可能产生两种错误:线程干扰和内存一致性错误,防止这些错误所需的工具是同步。 但是,同步可能会引入线程竞争,当两个或多个线程同时尝试访问同一资源并导致Java运行时更慢地执行一个或多个线程,甚至暂停它们执行,饥饿和活锁是线程竞争的形式。 本节包括以下主题: 线程干扰描述了当多个线程访问共享数据时如何引入错误。...

    Edison 评论0 收藏0
  • Java教程(目录)

    Java™ 教程 Java教程是为JDK 8编写的,本页面中描述的示例和实践没有利用在后续版本中引入的改进。 Java教程是希望使用Java编程语言创建应用程序的程序员的实用指南,其中包括数百个完整的工作示例和数十个课程,相关课程组被组织成教程。 覆盖基础知识的路径 这些教程以书籍的形式提供,如Java教程,第六版,前往Amazon.com购买。 入门 介绍Java技术和安装Java开发软件并使用...

    lifesimple 评论0 收藏0
  • Java教程(Lock对象)

    Lock对象 同步代码依赖于简单的可重入锁,这种锁易于使用,但有许多限制,java.util.concurrent.locks包支持更复杂的锁定语法,我们不会详细检查这个包,而是将重点放在其最基本的接口Lock上。 Lock对象的工作方式与同步代码使用的隐式锁定非常相似,与隐式锁一样,一次只有一个线程可以拥有一个Lock对象,Lock对象还通过其关联的Condition对象支持wait/notif...

    RobinQu 评论0 收藏0
  • 动力节点JavaNIO教程,轻松攻破Java NIO技术壁垒

    摘要:学习和掌握技术已经不是一个攻城狮的加分技能,而是一个必备技能。是双向的,不仅可以读取数据还能保存数据,程序不能直接读写通道,只与缓冲区交互为了让大家不被高并发与大量连接处理问题所困扰,动力节点推出了高效处理模型应用教程。 大家肯定了解Java IO, 但是对于NIO一般是陌生的,而现在使用到NIO的场景越来越多,很多技术框...

    ralap 评论0 收藏0
  • Java教程(守护阻塞)

    守护阻塞 线程通常必须协调他们的操作,最常见的协调用法是守护阻塞,这样的阻塞首先轮询一个条件,该条件必须为真,然后阻塞才能继续,要正确执行此操作,需要执行许多步骤。 例如,假设guardedJoy是一个方法,在另一个线程设置了共享变量joy之前,该方法不能继续,理论上,这种方法可以简单地循环直到满足条件,但该循环是浪费的,因为它在等待时持续执行。 public void guardedJoy() ...

    ivyzhang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<