首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何证明sleep不释放锁,而wait释放锁?

代码解析 从上述代码可以看出,我们给 wait() 和 notify() 两个方法上了同一把锁(locker),但在调用完 wait() 方法之后 locker 锁就被释放了,所以程序才能正常执行 notify...() 的代码,因为是同一把锁,如果不释放锁的话,是不会执行 notify() 的代码的,这一点也可以从打印的结果中证实(结果输出顺序),所以综合以上情况来说 wait() 方法是释放锁的。...方法之后才执行的 notify() 方法,因此可以证明调用 sleep() 方法并不会释放锁。...sleep 状态的线程不能被 notify 方法唤醒; wait 通常有条件地执行,线程会一直处于 wait 状态,直到某个条件变为真,但是 sleep 仅仅让你的线程进入睡眠状态; wait 方法会释放对象锁...post/5e6a4d8a6fb9a07cd80f36d1 总结 本文我们通过 synchronized 锁定同一对象,来测试 wait 和 sleep 方法,再通过执行结果的先后顺序证明:wait 方法会释放锁

2.7K20

漫画:如何证明sleep不释放锁,而wait释放锁?

代码解析 从上述代码可以看出,我们给 wait() 和 notify() 两个方法上了同一把锁(locker),但在调用完 wait() 方法之后 locker 锁就被释放了,所以程序才能正常执行 notify...() 的代码,因为是同一把锁,如果不释放锁的话,是不会执行 notify() 的代码的,这一点也可以从打印的结果中证实(结果输出顺序),所以综合以上情况来说 wait() 方法是释放锁的。...方法之后才执行的 notify() 方法,因此可以证明调用 sleep() 方法并不会释放锁。...sleep 状态的线程不能被 notify 方法唤醒; wait 通常有条件地执行,线程会一直处于 wait 状态,直到某个条件变为真,但是 sleep 仅仅让你的线程进入睡眠状态; wait 方法会释放对象锁...post/5e6a4d8a6fb9a07cd80f36d1 总结 本文我们通过 synchronized 锁定同一对象,来测试 wait 和 sleep 方法,再通过执行结果的先后顺序证明:wait 方法会释放锁

1.1K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java并发编程之ReentrantLock

    ReentrantLock lock = new ReentrantLock(); //加锁 lock.lock(); try { //需要执行的代码 }finally { //释放锁 lock.unlock..."); lock.unlock(); } } 输出结果: 获得到锁 尝试获得锁 获取立刻失败,返回 释放了锁 Process finished with exit code 0..."); lock.unlock(); } } 输出结果: main获得到锁 尝试获得锁 main线程释放了锁 t1获得到锁 Process finished with exit...code 0 4.5、公平锁 new ReentrantLock(true) ReentrantLock默认是非公平锁, 可以指定为公平锁 在线程获取锁失败,进入阻塞队列时,先进入的会在锁被释放后先获得锁...一般不设置ReentrantLock为公平的, 会降低并发度 Synchronized底层的Monitor锁就是不公平的, 和谁先进入阻塞队列是没有关系的 //默认是不公平锁,需要在创建时指定为公平锁

    6310

    可重入锁详解(什么是可重入)

    ,可以多次获取相同的锁 可重入锁有 synchronized ReentrantLock 使用ReentrantLock的注意点 ReentrantLock 和 synchronized 不一样,需要手动释放锁...,所以使用 ReentrantLock的时候一定要手动释放锁,并且加锁次数和释放次数要一样 以下代码演示,加锁和释放次数不一样导致的死锁 package com.test.reen; import java.util.Random...稍微改一下,在外层的finally里头释放9次,让加锁和释放次数一样,就没问题了 try { lock.lock(); System.out.println("第1次获取锁,这个锁是:"...代码省略节省篇幅... } finally { // lock.unlock();// 这里故意注释,实现加锁次数和释放次数不一样 } } } finally { lock.unlock...(); // 在外层的finally里头释放9次,让加锁和释放次数一样,就没问题了 for (int i = 0; i < 9; i++) { lock.unlock();

    93630

    Java中的可重入锁

    ReentrantLock 和 synchronized 不一样,需要手动释放锁,所以使用 ReentrantLock的时候一定要手动释放锁,并且加锁次数和释放次数要一样 例如 //演示可重入锁是什么意思...可以发现没发生死锁,可以多次获取相同的锁 可重入锁有 synchronized ReentrantLock 使用ReentrantLock的注意点 ReentrantLock 和 synchronized...不一样,需要手动释放锁,所以使用 ReentrantLock的时候一定要手动释放锁,并且加锁次数和释放次数要一样 以下代码演示,加锁和释放次数不一样导致的死锁 public class WhatReentrant3...} } } finally { lock.unlock(); // 在外层的finally里头释放9次,让加锁和释放次数一样,就没问题了 for...ReentrantLock与synchronized比较: 前者使用灵活,但是必须手动开启和释放锁 前者扩展性好,有时间锁等候(tryLock( )),可中断锁等候(lockInterruptibly(

    1.3K40

    聊一聊 ReentrantLock 类的一些玩法

    二、常用方法介绍 2.1、构造方法 ReentrantLock类有两个构造方法,核心源码内容如下: /** * 默认创建非公平锁 */ public ReentrantLock() { sync...true,否则,立即返回false public void unlock() 释放锁 public Condition newCondition() 条件实例,用于线程等待/通知模式 public int...,放弃尝试 ThreadName:Thread-0, 释放对象 可以很清晰的看到,非Thread-0线程尝试了 3 秒没有获取到锁,自动放弃;如果换成lock()方法进行获取锁,线程Thread-0如果不释放锁...2.2.2、unlock 方法 unlock()方法也是常用方法,表示释放锁。当获取到锁之后,一定要手动释放锁,否则可能会造成其它程序执行出现问题,通常用在finally方法块里面。...// 阻塞等待获取锁 lock.lock(); try { // 业务操作... } finally { // 一定要释放锁 lock.unlock(); } 2.2.2、newCondition

    20620

    到底什么是重入锁,拜托,一次搞清楚!

    为什么叫重入锁呢? ReentrantLock,我们把它拆开来看就明了了。...// ... method body } finally { lock.unlock() lock.unlock() } } 如示例代码所示,当前线程可以反复加锁...,但也需要释放同样加锁次数的锁,即重入了多少次,就要释放多少次,不然也会导入锁不被释放。...试想一下,如果不设计成可重入锁,那自己如果反复给自己加锁,不是会把自己加死锁了吗?所以,到现在,重入锁的概念大概应该清楚了吧? 重入锁最重要的几个方法 这几个方法都是 Lock 接口中定义的: ?...但要注意的是,释放锁操作必须在 finally 里面,不然如果出现异常导致锁不能被正常释放,进而会卡死后续所有访问该锁的线程。 synchronized 是重入锁吗?

    49020

    【说站】聊聊Java ReentrantLock中容易踩到的坑

    聊聊Java ReentrantLock中容易踩到的坑 在finally中释放锁 使用 ReentrantLock 时一定要记得释放锁,否则就会导致该锁一直被占用,其他使用该锁的线程则会永久的等待下去...,所以我们在使用 ReentrantLock 时,一定要在finally中释放锁,这样就可以保证锁一定会被释放。...        int number = 1 / 0;         // 释放锁         lock.unlock();         System.out.println("锁释放成功!...// 此处会报异常             int number = 1 / 0;         } finally {             // 释放锁             lock.unlock...;         }     } } 虽然方法中出现了异常情况,但并不影响 ReentrantLock 锁的释放操作,这样其他使用此锁的线程就可以正常获取并运行了。

    26120
    领券