对一种特殊的资源——对象中的内存——Java提供了内建的机制来防止它们的冲突。由于我们通常将数据元素设为从属于private(私有)类,然后只通过方法访问那些内存,所以只需将一个特定的方法设为synchronized(同步的),便可有效地防止冲突。在任何时刻,只可有一个线程调用特定对象的一个synchronized方法(尽管那个线程可以调用多个对象的同步方法)。下面列出简单的synchronized方法:
synchronized void f() { /* ... */ }
synchronized void g() { /* ... */ }
每个对象都包含了一把锁(也叫作“监视器”),它自动成为对象的一部分(不必为此写任何特殊的代码)。调用任何synchronized方法时,对象就会被锁定,不可再调用那个对象的其他任何synchronized方法,除非第一个方法完成了自己的工作,并解除锁定。在上面的例子中,如果为一个对象调用f(),便不能再为同样的对象调用g(),除非f()完成并解除锁定。因此,一个特定对象的所有synchronized方法都共享着一把锁,而且这把锁能防止多个方法对通用内存同时进行写操作(比如同时有多个线程)。
每个类也有自己的一把锁(作为类的Class对象的一部分),所以synchronized static方法可在一个类的范围内被相互间锁定起来,防止与static数据的接触。
注意如果想保护其他某些资源不被多个线程同时访问,可以强制通过synchronized方访问那些资源。
wait()和notify()比较特别的一个地方是这两个方法都属于基础类Object的一部分,不象sleep(),suspend()以及resume()那样属于Thread的一部分。尽管这表面看有点儿奇怪——居然让专门进行线程处理的东西成为通用基础类的一部分——但仔细想想又会释然,因为它们操纵的对象锁也属于每个对象的一部分。因此,我们可将一个wait()置入任何同步方法内部,无论在那个类里是否准备进行涉及线程的处理。事实上,我们能调用wait()的唯一地方是在一个同步的方法或代码块内部。若在一个不同步的方法内调用wait()或者notify(),尽管程序仍然会编译,但在运行它的时候,就会得到一个IllegalMonitorStateException(非法监视器状态违例),而且会出现多少有点莫名其妙的一条消息:“current thread not owner”(当前线程不是所有人”。注意sleep(),suspend()以及resume()都能在不同步的方法内调用,因为它们不需要对锁定进行操作。
只能为自己的锁定调用wait()和notify()。同样地,仍然可以编译那些试图使用错误锁定的代码,但和往常一样会产生同样的IllegalMonitorStateException违例。我们没办法用其他人的对象锁来愚弄系统,但可要求另一个对象执行相应的操作,对它自己的锁进行操作。所以一种做法是创建一个同步方法,令其为自己的对象调用notify()。

解决方案 »

  1.   

    import java.lang.Runnable;
    import java.lang.Thread;public class DemoThread implements Runnable{  public DemoThread() {
             TestThread testthread1 = new TestThread(this,"1");
             TestThread testthread2 = new TestThread(this,"2");         testthread2.start();
             testthread1.start();
      }  public static void main(String[] args) {
        DemoThread demoThread1 = new DemoThread();  }
       public void run(){        TestThread t = (TestThread) Thread.currentThread();
            try{
              if (!t.getName().equalsIgnoreCase("1")) {
                  synchronized(this) {               //-------------1
                      wait();
                  }
              }
              while(true){            System.out.println("@time in thread"+ t.getName()+ "="+ t.increaseTime());            if(t.getTime()%10 == 0) {
                  synchronized(this) {
                    System.out.println("****************************************");
                    notify();
                    if ( t.getTime()==100 ) break;
                    wait();
                }
              }
            }
            }catch(Exception e){e.printStackTrace();}
        }}class TestThread extends Thread{
        private int time = 0 ;
        public TestThread(Runnable r,String name){
          super(r,name);
        }
        public int getTime(){
           return time;
        }
        public int increaseTime (){
           return ++time;
        }
    }
    楼上说的,synchronized是方法的说明,而上面程序中注释1中是一个方法名,why?
      

  2.   

    synchronized可以对一个方法进行说明,也可以用作上述类型,注意他的参数——this,指的是获得该对象的“锁”,当然也可以使其他的对象。
    如果用在方法的声明,那么将对整个方法进行锁定。
      

  3.   

    synchronized是限定词!可以用于方法声明(同步方法),对象(同步对象,如你的例子中的synchronized(this) ),同步块(将一段代码同步)。
      

  4.   

    谢谢ycats(加菲猫)
    谢谢foryouever()
      

  5.   

    synchronized 是java的keyword, 不时方法,
    modify method,同一时刻只可能被一个对象执行
    modify object,同一时刻只能有一个对象对object有控制权.wait()方法是java.lang.object中有的.