zoukankan      html  css  js  c++  java
  • java-并发-活性

      浏览以下内容前,请点击并阅读 声明

      一个并发程序以适时方式执行的能力叫活性。以下部分介绍最常见的一种活性问题,死锁,并简单介绍其他两种活性问题,饥饿和活锁。

    死锁

      死锁描述了一种情况:两个或两个以上的线程都被永久封堵,而他们还在相互等待对方释放一个对象的锁。

    public class DeadLock {
    //嵌套类
        static class Friend {
            private  String name;
            public Friend(String name) {
                this.name = name;
            }
    //注意以下两个方法均为同步方法,运行该方法都要请求对应对象的锁
            public  synchronized String getName() { 
                return this.name;
            }
            public synchronized void introduce(Friend he) { 
                System.out.format(  "I'm "+"%s%n", this.name);
                System.out.format(  "And she is "+"%s%n", he.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.introduce(gaston); }
            }).start();
            new Thread(new Runnable() {
                public void run() { gaston.introduce(alphonse); }
            }).start();
        }
    } 

       运行以上代码,很有可能就会产生死锁,程序无法结束运行,因为两个线程可能同时拥有一个对象的锁(同步方法造成的),同时又想请求对方已拥有的锁,这样就会造成死锁。

      打个比方,甲乙两个人同时想往木板上钉钉子,而工具只有一把锤子和一盒钉子,甲先拿到了锤子,而乙则抢到了钉子,这样就陷入了僵局,即死锁。人可能比较会变通,其中任何一个人让一下,谁都能完成工作,而机器不会,他们严格遵守先拿先用的原则,这样就陷入了无休止的死锁当中,当然以上我说的可能产生死锁,是因为其有一定的概率,可能有一个线程先拿到两个对象的锁,并执行完毕,这样就不会产生死锁。

    饥饿

      饥饿和活锁较死锁更为少见,但依然是并发软件设计中可能遇到的问题。

      饥饿是指一个线程需要经常请求一个资源而无法得到满足,因而使其进展缓慢的情况。一个共享的对象资源被一个“贪婪”的线程长期占据,比如该共享对象中有一个同步方法需要长时间才能执行完成,而另外一个线程则需要频繁同步访问该共享对象就会被经常堵塞,饥饿就产生了。

    活锁

      如果一个线程的动作响应另外一个线程,而另外一个线程的动作也响应该线程,这样就可能会产生活锁。就像死锁一样,活锁导致线程无法继续运行,然而线程并未被封堵,只是忙于相互响应而无法恢复工作,打个比方,甲乙两人迎面要走过一个走廊,甲向左以避开乙,而乙却向右,这样就又堵住了对方的路,甲乙又同时响应对方。。。没错,还是过不去。

  • 相关阅读:
    自定义异常
    java代码中正则表达式
    mybatis中代码如何实现批量添加
    List集合的三种遍历方式的效率问题
    4种方式配置不同作用域的jvm的堆栈内存!
    如何在Eclipse里修改端口
    如何用Eclipse打jar包
    用explain来解析sql语句,然后建立正确的索引
    quartz简单demo,教你最快使用quartz
    log4j.properties配置详解
  • 原文地址:https://www.cnblogs.com/justforcon/p/6103080.html
Copyright © 2011-2022 走看看