突然觉得这好象是不是矛盾的。

解决方案 »

  1.   

    等待机制和锁机制是密切相关的,在调用wait()之前,线程必须获得该对象的对象级别所的排斥性访问权限,在进入wait()后,该线程释放锁(为了让其他的线程得到该对象的锁,从而执行Notifty()),当从wait()返回前,线程与其他线程竞争重新获得锁。
    在一个synchronized()的代码块中不一定要拥有wait(),当从该synchronized块中离开时就可以释放锁,不管是执行完毕还是return,throw等,从该块内调用方法是不会失去锁的
    我发现LZ的问题都有些奇怪,这些问题只要自己查一下资料,答案是很明显的
      

  2.   

    楼主把锁和条件对象搞混了吧。
    每个对象都有一个内部对象锁,这个锁有一个相关条件。
    用synchronizde声明的方法,表示这个内部对象所就会保护整个方法。而wait()是说明即使有一个线程获得锁了,但是不满足一定的条件,也会把这个线程添加到等待集中,相应的notifty()则是说明条件满足了,等到下一次线程获得锁的时候就可以执行相关的代码。
      

  3.   

    synchronized是保持执行的这段代码的锁不被其他线程拥有 如果synchronized中的代码执行完毕
    其他线程就获得了这个机会
      

  4.   

    wait():
     Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.
      

  5.   

    wait()是不同于sleep的,sleep是说当前线程即使sleep状态也抱着这把锁,其余的方法不可以访问,而wait方法只是说当前线程处于等待状态,但是如果改方法即使加锁了,别的线程也可以访问的,只是当前线程等待。
      

  6.   

    我反而觉得基础难。
    现在越来越觉得wait() = notify();
    我知道书上说不一样。理解起来是一样的。
    1)都是释放锁。
    2)都是退出当前运行
    3)唤醒别人进来执行。
      

  7.   

    如何这样理解就有区别了
    wait是释放共享锁并将该线程加入object的等待“队列”(并不是先进先出)中。
    notify是在该object的等待“队列”中唤醒一个等待的线程。
      

  8.   

    wait() = notify(); 这个不一样的
      

  9.   

    wait和notify都是释放锁,sleep不释放synchronized()的代码块中运行完就释放锁了wait和notify必须先获得唯一控制权,一般用加锁实现看看下面代码的结果你应该会明白一点
    package test;public class TestThread { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    new TestThread(); } public String a = "test"; public TestThread() {
    Thread thread1 = new WaitThread();
    Thread thread2 = new WaitThread();
    thread1.start();
    thread2.start(); try {
    Thread.sleep(2000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    Thread thread3 = new NotifyThread();
    thread3.start(); } class WaitThread extends Thread {
    public void run() {
    synchronized (a) {
    try {
    System.out.println("before wait : " + Thread.currentThread() + ":" + a);
    a.wait();
    System.out.println("after wait : " + Thread.currentThread() + ":" + a);
    System.out.println("before sleep : " + Thread.currentThread() + ":" + a);
    sleep(1000);
    System.out.println("after sleep : " + Thread.currentThread() + ":" + a);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    } class NotifyThread extends Thread {
    public void run() {
    synchronized (a) {
    a.notifyAll();
    }
    }
    }
    }