java并发(四、活性)

来源:互联网 发布:mysql 中树形机构查询 编辑:程序博客网 时间:2024/04/29 17:29
四、活性(一)死锁一个并发应用的即使执行能力叫做它的活性。这章描述了很多一般类型的活性问题,死锁,然后简单的描述了另两个问题,饥饿和活锁。死锁就是俩个或多个线程互相等待造成永远被阻塞的状况。这里有一个例子。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运行,当2个线程试图调用bowBack时,非常有可能这2个线程会被阻塞。并且阻塞永远不会结束,因为每个线程都在等待其他的线程退出bow。(二)饥渴和活锁饥渴和活锁相比死锁是不那么常见的问题,但是仍然是同步软件开发的每个开发者有可能会遇到的问题。1.饥渴饥渴描述了这样一种状况:一个线程不能够正常访问共享资源造成它不能够前进往下执行。这通常发生在当共享资源因为贪婪的线程长时间不能够被其他线程获得。比如,假如有一个同步方法通常需要很长时间才返回。如果一个线程频繁调用这个方法,其他的线程也需要频繁的同步访问同一个对象,这就会造成阻塞。2.活锁一个线程通常会有一些动作回应其他线程的活动。如果其他线程也会回应另一个线程的活动。这时就会导致活锁的发生。就像死锁,活锁也不能继续向前执行。然而线程并没有被阻塞-它们只是忙于彼此互相回应而不能继续工作。这可以比作有2个人在走廊上试图让彼此都通过:Alphonse移动他的左脚让Gaston通过,同时Gaston移动他的右脚让Alphonse通过。可以看到他们仍然互相阻塞,Alphone移动他右脚的时候,Gaston移动他的左脚。他们仍然互相阻塞,这样…