为什么等待同步?

时间:2014-08-29 12:47:56

标签: java multithreading wait synchronized java.util.concurrent

为什么wait()位于同步块内?我的意思是,只有一个线程会进入synchronized块,那么另一个线程如何执行wait()指令呢?

2 个答案:

答案 0 :(得分:2)

  1. 同步关键字用于独占访问。
  2. 要使方法同步,只需将synchronized关键字添加到其声明中。然后,对同一对象的两个同步方法的调用不能相互交错。
  3. 同步语句必须指定提供内部锁定的对象。使用synchronized(this)时,必须避免同步其他对象方法的调用。
  4. wait()告诉调用线程放弃监视器并进入休眠状态,直到某个其他线程进入同一个监视器并调用notify()。
  5. notify()唤醒在同一个对象上调用wait()的第一个线程。
  6. 示例:

    public class ThreadA {
        public static void main(String[] args){
            ThreadB b = new ThreadB();
            b.start();
    
            synchronized(b){
                try{
                    System.out.println("Waiting for b to complete...");
                    b.wait();
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
    
                System.out.println("Total is: " + b.total);
            }
        }
    }
    
    class ThreadB extends Thread{
        int total;
        @Override
        public void run(){
            synchronized(this){
                for(int i=0; i<100 ; i++){
                    total += i;
                }
                notify();
            }
        }
    }
    

    来自:http://www.programcreek.com/2009/02/notify-and-wait-example/

答案 1 :(得分:0)

Why is wait() inside of a synchronized block?

因为线程需要使用您正在调用wait()的对象的监视器,对于同步方法,需要this对象。

I mean, only one thread will enter the synchronized block, so how can the other 
thread execute the wait() instruction?

它不能,只有synchronized块内的线程可以执行wait(),允许其他线程进入同步块。