Java™ 教程(并发活性)

并发活性

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

死锁

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

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

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时极有可能会阻塞,两个阻塞都不会结束,由于每一个线程都在等待另外一个线程退出bowsegmentfault

饥饿和活锁

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

饥饿

饥饿描述了一种状况,即线程没法得到对共享资源的按期访问,而且没法取得进展,当“贪婪”线程使共享资源长时间不可用时会发生这种状况。例如,假设一个对象提供了一个一般须要很长时间才能返回的同步方法,若是一个线程频繁地调用此方法,其余也须要频繁同步访问同一对象的线程将常常被阻塞。this

活锁

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


上一篇:同步

下一篇:守护阻塞

相关文章
相关标签/搜索