前言
以前只知道一个结论,但是没法理解,现在水平上来了,自己代码中写了一个验证的方法。
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 秒才输出,说明没有释放锁对象。
(2).用list.wait(10000),三个线程一起输出当前时间,说明是释放了锁对象被其他线程获取了。