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 }