Thread.sleep()不释放锁 Object.wait()释放锁

sleep()方法
sleep()方法是线程类(Thread)的静态方法,让调用的线程进入指定时间睡眠状态,使得当前线程进入阻塞状态。
当线程获取锁时,sleep()方法不会释放对象锁
wait()方法
wait()方法是Object类里的方法, wait()方法、notify()方法和notiftAll()方法用于协调多线程对共享数据的存取,所以只能在同步方法或者同步块中使用,否则抛出IllegalMonitorStateException。

这里用两段代码演示

sleep不会释放锁

public class SleepTeset {
    public static void main(String[] args) {
        final Object lock = new Object();

        Thread thread1 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("线程1获取到锁");
                System.out.println("线程1执行sleep()");
                try {
                    Thread.sleep(3000);
                    System.out.println("线程1苏醒了——释放了锁");

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread thread2 = new Thread(() -> {
                // 睡眠一段时间,确保线程1先获取到锁并执行wait()
            System.out.println("现在是线程2");
//                Thread.sleep(1000);
            synchronized (lock) {
                System.out.println("线程2获取到锁");
                System.out.println("线程2释放锁");
            }
        });

        // 启动线程
        thread1.start();
        thread2.start();
    }
}

在这里插入图片描述
当线程1执行 Thread.sleep() 后,线程2开始执行了,但是进不去synchronized代码块,直到3秒后才继续执行线程1,因为 sleep方法不会释放锁

wait会释放锁

public class WaitTest {
    public static void main(String[] args) {
        final Object lock = new Object();

        Thread thread1 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("线程1获取到锁");
                System.out.println("线程1执行sleep()");
                try {
                    lock.wait(3000);
                    System.out.println("线程1回来啦");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread thread2 = new Thread(() -> {
                // 睡眠一段时间,确保线程1先获取到锁并执行wait()
            System.out.println("现在是线程2");
//                Thread.sleep(1000);
            synchronized (lock) {
                System.out.println("线程2获取到锁");
                System.out.println("线程2释放锁");
            }
        });

        // 启动线程
        thread1.start();
        thread2.start();
    }
}

在这里插入图片描述
这里虽然 wait(3000) 延迟了3秒,但执行线程2的时候没有延迟,可以自己复制去试试,就是因为线程2在执行 synchronized 代码块时可以直接获取锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值