java认证辅导:java线程小结Java认证考试

文章作者 100test 发表时间 2010:01:01 15:50:59
来源 100Test.Com百考试题网


  1, 为什么wait与notify之前必须要加synchronized?

  答案其实很简单,也是为了防止等待-通知机制出现race condition

  为什么会出现race condition ?
  答: 对象在被wait之前已经被另一线程notify , 之后的wait 会永久停止,并导致deadlock(死锁)

  理想情况:
  1, 第一个线程判断该对象是否要wait
  2, 第一个线程将对象wait
  3, 第二个线程再将对象notify

  实际情况
  1, 第一个线程判断该对象是否要wait
  2, 第二个线程将对象notify
  3, 第一个线程将对象wait

  为了防止这些情况,才需要在wait与notify之前加synchronized

  java 代码

  A a = A.getInstance().//单例对象,同一份实例不销毁
  synchronized (a) {
  a.wait().
  }
  -------------------------------另一线程
  A a = A.getInstance().
  synchronized(a) {
  a.notify().
  }
  等待-通知机制必须与sychronized一起用,否则自身也会有 race condition.

  2, 静态同步方法与非静态同步方法的区别

  有时,我们经常会碰到这样的代码!

  业务逻辑的封装类:

  public class Logic {
    private static final Log log = LogFactory.getLog(Logic.class).
    private static Logic logic.

    private Logic() {}

    public static Logic getInstance() {
      if (null == logic) {
        logic = new Logic().
      }

      return logic.
    }

    public static synchronized void testStatic() {
      log.info(Thread.currentThread().getName() " : static method is running").
    }

    public synchronized void testNonStatic() {
      log.info(Thread.currentThread().getName() " : non static method is running").
    }
  }
  非静态方法的执行:

  public class ThreadRun1 extends Thread {
    private static final Log log = LogFactory.getLog(ThreadRun1.class).

    public void run() {
      Logic logic = Logic.getInstance(). // object reference

      try {
        Thread.sleep(3000).
      } catch (InterruptedException e) {
        log.error("some exceptions occured :", e).
      }

      logic.testNonStatic().

      logEnd().
    }

    private void logEnd() {
      log.info("thread run1 end").
    }
  }
  静态类方法的执行

  public class ThreadRun2 extends Thread {
    private static final Log log = LogFactory.getLog(ThreadRun1.class).

    public void run() {
      Logic.testStatic(). // class static reference

      try {
        Thread.sleep(5000).
      } catch (InterruptedException e) {
        log.error("some error ocuur :", e).
      }

      logEnd().
    }

    private void logEnd() {
      log.info("thread run2 end").
    }
  }
  测试类

  public class TestThread {

    /**
  


相关文章


Java设计模式之Flyweight模式Java认证考试
Java设计模式之模板方法模式Java认证考试
java认证辅导:J2ME游戏破解Java认证考试
SpringAOP面向方面编程原理:AOP概念Java认证考试
java认证辅导:java线程小结Java认证考试
Java认证辅导:Java数组赋值的问题Java认证考试
使用java语言中的枚举enumJava认证考试
Java中ArrayList和LinkedList的比较Java认证考试
Java线程:volatile关键字Java认证考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛