证明 sleep()方法不会释放已经抢得的锁

本文详细介绍了Java中sleep()方法和wait()方法的区别。sleep()方法不会释放锁,而wait()方法会释放锁,使得其他线程有机会获得锁。wait()需要与其他线程协作,通过notify()或notifyAll()唤醒。在示例代码中展示了多个线程如何交替获取并释放锁,体现了两者在线程同步中的不同作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

说说 sleep() 方法和 wait() 方法区别和共同点?

两者最主要的区别在于:sleep() 方法没有释放锁,而 wait() 方法释放了锁
两者都可以暂停线程的执行。
wait() 通常被用于线程间交互/通信,sleep() 通常被用于暂停执行。
wait() 方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的 notify() 或者 notifyAll() 方法。sleep() 方法执行完成后,线程会自动苏醒。或者可以使用 wait(long timeout) 超时后线程会自动苏醒。

原码注解

Causes the currently executing thread to sleep (temporarily cease execution) for the 
specified number of milliseconds, subject to the precision and accuracy of system 
timers and schedulers. The thread does not lose ownership of any monitors.
证明
public static void main(String[] args) {
        Object lock = new Object();
        ExecutorService executorService = Executors.newCachedThreadPool();
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                synchronized (lock){
                    //给共享对象lock加锁
                    try {
                        System.out.println(Thread.currentThread().getName() + "获取锁进来了");
                        TimeUnit.SECONDS.sleep(5);
                        System.out.println(Thread.currentThread().getName() + "释放锁出来了");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            }
        };
        for (int i = 0; i < 5; i++) {
            //启动五个线程执行
            executorService.execute(runnable);
        }
    }

控制台:

pool-1-thread-1获取锁进来了
pool-1-thread-1释放锁出来了
pool-1-thread-5获取锁进来了
pool-1-thread-5释放锁出来了
pool-1-thread-4获取锁进来了
pool-1-thread-4释放锁出来了
pool-1-thread-3获取锁进来了
pool-1-thread-3释放锁出来了
pool-1-thread-2获取锁进来了
pool-1-thread-2释放锁出来了

Process finished with exit code 0

根据引用的内容,sleep方法在使用时不会释放对象,即当前线程睡眠期间其他线程无法访问被该线程住的对象。因此,sleep方法不会释放。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [使用sleep方法,线程进入sleep休眠状态不会释放](https://blog.youkuaiyun.com/m0_46080170/article/details/117456872)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C#中sleep和wait的区别分析](https://download.youkuaiyun.com/download/weixin_38633967/14873497)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [sleep,yield,wait,join操作是否会释放资源](https://blog.youkuaiyun.com/LM1997/article/details/124188663)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值