java中wait()和sleep()的区别

时间:2021-10-30 13:22:00

前言

以前只知道一个结论,但是没法理解,现在水平上来了,自己代码中写了一个验证的方法。

1.先上结论:wait()会释放持有的锁,sleep()不会释放持有的锁

2.验证:看代码运行结果。

 1 package com.jtfr.test;
 2 
 3 import java.text.SimpleDateFormat;
 4 import java.util.ArrayList;
 5 import java.util.Date;
 6 import java.util.List;
 7 
 8 
 9 /**
10  * 测试 wait和sleep方法
11  * 按照网上说的:wait会释放锁,sleep不会释放锁,写个案例执行下。
12  * @author 陈康明 qq:1123181523
13  * @date 2019年3月10日
14  */
15 public class TestWait {
16     
17     private static List<String> list = new ArrayList<String>();
18 
19     public static void main(String[] args) {
20         TestWait test = new TestWait();
21         WaitSleep w1 = test.new WaitSleep();
22         WaitSleep w2 = test.new WaitSleep();
23         WaitSleep w3 = test.new WaitSleep();
24         w1.start();
25         w2.start();
26         w3.start();
27     }
28     
29     class WaitSleep extends Thread{
30         
31         @Override
32         public void run() {
33             synchronized (list) {
34                 try {
35                     System.out.println(Thread.currentThread().getName()+"当前系统时间:"+new SimpleDateFormat("hh:mm:ss").format(new Date()));
36                     // 等待 10 秒, 看其他对象是否拿到锁
37                     //list.wait(10000);
38                     Thread.sleep(10000);
39                 } catch (Exception e) {
40                     e.printStackTrace();
41                 }
42             }
43         }
44     }
45 }

(1).用Thread.sleep(1000),三个线程隔了 10 秒才输出,说明没有释放锁对象。

java中wait()和sleep()的区别

(2).用list.wait(10000),三个线程一起输出当前时间,说明是释放了锁对象被其他线程获取了。

 java中wait()和sleep()的区别