1 import java.util.concurrent.TimeUnit; 2 3 4 public class Example2 { 5 6 /** 7 * @param args 8 */ 9 public static void main(String[] args) { 10 // TODO Auto-generated method stub 11 final Object synObj = new Object(); 12 Thread t1 = new Thread(new Runnable() { 13 @Override 14 public void run() { 15 synchronized(synObj) { 16 System.out.println("1.T1获取synObj的对象监视器,开始执行同步块"); 17 try { 18 TimeUnit.MINUTES.sleep(1);//休息一分钟,不放弃锁 19 System.out.println("T1在 wait()时挂起了"); 20 synObj.wait(); 21 System.out.println("T1被T2唤醒后并重新获得synObj的对象监视器,继续执行"); 22 }catch(InterruptedException e) { 23 e.printStackTrace(); 24 } 25 System.out.println("T1获取synObj的对象监视器,结束同步块"); 26 } 27 }; 28 }); 29 t1.start(); 30 31 32 Thread t2 = new Thread(new Runnable() { 33 @Override 34 public void run() { 35 System.out.println("T2启动,但是因为T1占用了synObj的对象监视器,则等待T1执行synObj.wait来释放它"); 36 synchronized(synObj) { 37 try { 38 System.out.println("在T1执行synObj.wait后,T2获取synObj的对象监视器,进入同步块"); 39 synObj.notify(); 40 System.out.println("T2执行synObj.notify(),T1被唤醒,但T2还在同步块中,没有释放synObj的对象监视器,T1等待synObj的对象监视器"); 41 TimeUnit.MINUTES.sleep(1); 42 System.out.println("T2结束同步块,释放synObj的对象监视器,T1获取到synObj的对象监视器,并执行wait后面的操作"); 43 }catch(InterruptedException e) { 44 e.printStackTrace(); 45 } 46 } 47 }; 48 }); 49 t2.start(); 50 51 52 } 53 54 }