执行wait方法会释放锁,执行notify不会释放锁

  1. package com.qf.test05.pojo;
  2.  
  3. /**
  4. * @author qf
  5. * @create 2018-09-18 10:41
  6. */
  7. public class Service {
  8. public void testMethod(Object lock){
  9. try {
  10. synchronized (lock){
  11. System.out.println("begin wait");
  12. lock.wait();
  13. System.out.println("end wait");
  14. }
  15. } catch (InterruptedException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. }

线程类

  1. package com.qf.test05.thread;
  2.  
  3. import com.qf.test05.pojo.Service;
  4.  
  5. /**
  6. * @author qf
  7. * @create 2018-09-18 10:43
  8. */
  9. public class ThreadA extends Thread {
  10. private Object lock;
  11.  
  12. public ThreadA(Object lock) {
  13. this.lock = lock;
  14. }
  15.  
  16. @Override
  17. public void run() {
  18. Service service = new Service();
  19. service.testMethod(lock);
  20. }
  21. }
  1. package com.qf.test05.thread;
  2.  
  3. import com.qf.test05.pojo.Service;
  4.  
  5. /**
  6. * @author qf
  7. * @create 2018-09-18 10:43
  8. */
  9. public class ThreadB extends Thread {
  10. private Object lock;
  11.  
  12. public ThreadB(Object lock) {
  13. this.lock = lock;
  14. }
  15.  
  16. @Override
  17. public void run() {
  18. Service service = new Service();
  19. service.testMethod(lock);
  20. }
  21. }

测试运行

  1. package com.qf.test05;
  2.  
  3. import com.qf.test05.thread.ThreadA;
  4. import com.qf.test05.thread.ThreadB;
  5.  
  6. /**
  7. * @author qf
  8. * @create 2018-09-18 10:44
  9. */
  10. public class Run {
  11. public static void main(String[] args) {
  12. Object lock = new Object();
  13. ThreadA a = new ThreadA(lock);
  14. a.start();
  15. ThreadB b = new ThreadB(lock);
  16. b.start();
  17. }
  18. }

控制台输出结果

  1. begin wait
  2. begin wait

证明了wait方法执行后会释放锁

========================================================================

  1. package com.qf.test06.pojo;
  2.  
  3. /**
  4. * @author qf
  5. * @create 2018-09-18 14:05
  6. */
  7. public class Service {
  8. public void testWait(Object lock){
  9. try {
  10. synchronized (lock){
  11. System.out.println("线程名:"+Thread.currentThread().getName()+", begin wait time="+System.currentTimeMillis());
  12. lock.wait();
  13. System.out.println("线程名:"+Thread.currentThread().getName()+", --end wait time="+System.currentTimeMillis());
  14. }
  15. } catch (InterruptedException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19.  
  20. public void testNotify(Object lock){
  21. try {
  22. synchronized (lock){
  23. System.out.println("线程名:"+Thread.currentThread().getName()+", begin notify time="+System.currentTimeMillis());
  24. lock.notify();
  25. Thread.sleep(5000);
  26. System.out.println("线程名:"+Thread.currentThread().getName()+", --end notify time="+System.currentTimeMillis());
  27. }
  28. } catch (InterruptedException e) {
  29. e.printStackTrace();
  30. }
  31. }
  32. }

线程类

  1. package com.qf.test06.thread;
  2.  
  3. import com.qf.test06.pojo.Service;
  4.  
  5. /**
  6. * @author qf
  7. * @create 2018-09-18 14:07
  8. */
  9. public class ThreadA extends Thread {
  10. private Object lock;
  11.  
  12. public ThreadA(Object lock) {
  13. this.lock = lock;
  14. }
  15.  
  16. @Override
  17. public void run() {
  18. Service service = new Service();
  19. service.testWait(lock);
  20. }
  21. }
  1. package com.qf.test06.thread;
  2.  
  3. import com.qf.test06.pojo.Service;
  4.  
  5. /**
  6. * @author qf
  7. * @create 2018-09-18 14:11
  8. */
  9. public class ThreadB extends Thread {
  10. private Object lock;
  11.  
  12. public ThreadB(Object lock) {
  13. this.lock = lock;
  14. }
  15.  
  16. @Override
  17. public void run() {
  18. Service service = new Service();
  19. service.testNotify(lock);
  20. }
  21. }
  1. package com.qf.test06.thread;
  2.  
  3. import com.qf.test06.pojo.Service;
  4.  
  5. /**
  6. * @author qf
  7. * @create 2018-09-18 14:11
  8. */
  9. public class ThreadC extends Thread {
  10. private Object lock;
  11.  
  12. public ThreadC(Object lock) {
  13. this.lock = lock;
  14. }
  15.  
  16. @Override
  17. public void run() {
  18. Service service = new Service();
  19. service.testNotify(lock);
  20. }
  21. }

测试运行

  1. package com.qf.test06;
  2.  
  3. import com.qf.test06.thread.ThreadA;
  4. import com.qf.test06.thread.ThreadB;
  5. import com.qf.test06.thread.ThreadC;
  6.  
  7. /**
  8. * @author qf
  9. * @create 2018-09-18 14:13
  10. */
  11. public class Run {
  12. public static void main(String[] args) {
  13. Object lock = new Object();
  14. ThreadA a = new ThreadA(lock);
  15. a.setName("A");
  16. a.start();
  17. ThreadB b = new ThreadB(lock);
  18. b.setName("B");
  19. b.start();
  20. ThreadC c = new ThreadC(lock);
  21. c.setName("C");
  22. c.start();
  23. }
  24. }

打印结果

  1. 线程名:A, begin wait time=1537252123977
  2. 线程名:B, begin notify time=1537252123978
  3. 线程名:B, --end notify time=1537252128978
  4. 线程名:A, --end wait time=1537252128978
  5. 线程名:C, begin notify time=1537252128978
  6. 线程名:C, --end notify time=1537252133978

证明了notify方法执行后并不会释放锁

wait/notify方法的更多相关文章

  1. java多线程详解(6)-线程间的通信wait及notify方法

    Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...

  2. Java 多线程(七) 线程间的通信——wait及notify方法

    线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法: http://docs.oracle.com/ ...

  3. Java使用wait() notify()方法操作共享资源

    Java多个线程共享资源: 1)wait().notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写. 2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线 ...

  4. 并发编程之 wait notify 方法剖析

    前言 2018 元旦快乐. 摘要: notify wait 如何使用? 为什么必须在同步块中? 使用 notify wait 实现一个简单的生产者消费者模型 底层实现原理 1. notify wait ...

  5. Java中wait()和notify()方法的使用

    1. wait方法和notify方法 这两个方法,包括notifyAll方法,都是Object类中的方法.在Java API中,wait方法的定义如下: public final void wait( ...

  6. 对象的notify方法的含义和对象锁释放的三种情况

    1,notify的含义     (1)notify一次只随机通知一个线程进行唤醒 (2)在执行了notify方法之后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁, 要等到 ...

  7. wait()、notify()方法原理,以及使用注意事项

    wait.notify原理 在前面以经说到对象锁的本质,实际上是对象头的一个监视器锁的数据结构.这个结构如下: (图片来源于网络) 几个线程一起竞争对象的锁(enter),只有一个能成功(acquir ...

  8. Java精通并发-透过openjdk源码分析wait与notify方法的本地实现

    上一次https://www.cnblogs.com/webor2006/p/11442551.html中通过openjdk从c++的底层来审视了ObjectMonitor的底层实现,这次继续来探究底 ...

  9. Java精通并发-notify方法详解及线程获取锁的方式分析

    wait(): 在上一次https://www.cnblogs.com/webor2006/p/11404521.html中对于无参数的wait()方法的javadoc进行了解读,而它是调用了一个参数 ...

  10. Java使用wait() notify()方法操作共享资源详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 Java多个线程共享资源: 1)wait().notify()和notifyAll()方法是本地方法,并且为final方 ...

随机推荐

  1. 50.Maximal Square(最大正方形)

    Level   Medium 题目描述: Given a 2D binary matrix filled with 0's and 1's, find the largest square conta ...

  2. Groovy学习:第二章 Groovy语言的关键特征

    1. 断言Assertion断言:用于判断预期的条件是否为真.例子:def list = [1,2,'x']assert list.size()==32. AST转换期使用的注释AST转换的注释:Gr ...

  3. js非数值的比较

    /** * 非数值的比较: * 1.对于非数值的比较时,会将其转换成数字然后再比较 * 2.如果符号两端是字符串的值进行比较时,不会将其转换为数字进行比较,而是 * 分别比较字符串中的字符的 unic ...

  4. hibernate 参数一览

    实现包含了Hibernate与数据库的基本连接信息的配置方式有两种方式: 第一种是使用hibernate.properties文件作为配置文件. 第二种是使用hibernate.cfg.xml文件作为 ...

  5. .net Core在过滤器中获取 系统接口方法(以IMemoryCache 为例) 及HttpContext 获取系统接口

    public   Class  SysActionAttribute :Attribute, IActionFilter      //  Attribute  用于控制器中 特性控制,当在控制器或控 ...

  6. 2019-9-2-win10-uwp-隐私声明

    title author date CreateTime categories win10 uwp 隐私声明 lindexi 2019-09-02 12:57:38 +0800 2018-2-13 1 ...

  7. 一、bootstrap-select输入选择框

    一.bootstrap-select简单使用 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  8. centos系统jdk安装

    下载Oracle官网的jdk来安装 不使用openjdk 最新的官网地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk8- ...

  9. java23种设计模式(二)-- 建造者模式和原型模式

    一.建造者模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创造不同的表示. 特点: (1).在某些属性没有赋值之前,复杂对象不能作为一个完整的产品使用.比如汽车包括方向盘.车门.发动机 ...

  10. c# 定义operator运算符

    public void TestFunc() { Complex complex1 = new Complex(); Complex complex2 = new Complex(); var s = ...