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

 package com.qf.test05.pojo;

 /**
* @author qf
* @create 2018-09-18 10:41
*/
public class Service {
public void testMethod(Object lock){
try {
synchronized (lock){
System.out.println("begin wait");
lock.wait();
System.out.println("end wait");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

线程类

 package com.qf.test05.thread;

 import com.qf.test05.pojo.Service;

 /**
* @author qf
* @create 2018-09-18 10:43
*/
public class ThreadA extends Thread {
private Object lock; public ThreadA(Object lock) {
this.lock = lock;
} @Override
public void run() {
Service service = new Service();
service.testMethod(lock);
}
}
 package com.qf.test05.thread;

 import com.qf.test05.pojo.Service;

 /**
* @author qf
* @create 2018-09-18 10:43
*/
public class ThreadB extends Thread {
private Object lock; public ThreadB(Object lock) {
this.lock = lock;
} @Override
public void run() {
Service service = new Service();
service.testMethod(lock);
}
}

测试运行

 package com.qf.test05;

 import com.qf.test05.thread.ThreadA;
import com.qf.test05.thread.ThreadB; /**
* @author qf
* @create 2018-09-18 10:44
*/
public class Run {
public static void main(String[] args) {
Object lock = new Object();
ThreadA a = new ThreadA(lock);
a.start();
ThreadB b = new ThreadB(lock);
b.start();
}
}

控制台输出结果

begin wait
begin wait

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

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

 package com.qf.test06.pojo;

 /**
* @author qf
* @create 2018-09-18 14:05
*/
public class Service {
public void testWait(Object lock){
try {
synchronized (lock){
System.out.println("线程名:"+Thread.currentThread().getName()+", begin wait time="+System.currentTimeMillis());
lock.wait();
System.out.println("线程名:"+Thread.currentThread().getName()+", --end wait time="+System.currentTimeMillis());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} public void testNotify(Object lock){
try {
synchronized (lock){
System.out.println("线程名:"+Thread.currentThread().getName()+", begin notify time="+System.currentTimeMillis());
lock.notify();
Thread.sleep(5000);
System.out.println("线程名:"+Thread.currentThread().getName()+", --end notify time="+System.currentTimeMillis());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

线程类

 package com.qf.test06.thread;

 import com.qf.test06.pojo.Service;

 /**
* @author qf
* @create 2018-09-18 14:07
*/
public class ThreadA extends Thread {
private Object lock; public ThreadA(Object lock) {
this.lock = lock;
} @Override
public void run() {
Service service = new Service();
service.testWait(lock);
}
}
 package com.qf.test06.thread;

 import com.qf.test06.pojo.Service;

 /**
* @author qf
* @create 2018-09-18 14:11
*/
public class ThreadB extends Thread {
private Object lock; public ThreadB(Object lock) {
this.lock = lock;
} @Override
public void run() {
Service service = new Service();
service.testNotify(lock);
}
}
 package com.qf.test06.thread;

 import com.qf.test06.pojo.Service;

 /**
* @author qf
* @create 2018-09-18 14:11
*/
public class ThreadC extends Thread {
private Object lock; public ThreadC(Object lock) {
this.lock = lock;
} @Override
public void run() {
Service service = new Service();
service.testNotify(lock);
}
}

测试运行

 package com.qf.test06;

 import com.qf.test06.thread.ThreadA;
import com.qf.test06.thread.ThreadB;
import com.qf.test06.thread.ThreadC; /**
* @author qf
* @create 2018-09-18 14:13
*/
public class Run {
public static void main(String[] args) {
Object lock = new Object();
ThreadA a = new ThreadA(lock);
a.setName("A");
a.start();
ThreadB b = new ThreadB(lock);
b.setName("B");
b.start();
ThreadC c = new ThreadC(lock);
c.setName("C");
c.start();
}
}

打印结果

线程名:A, begin wait time=1537252123977
线程名:B, begin notify time=1537252123978
线程名:B, --end notify time=1537252128978
线程名:A, --end wait time=1537252128978
线程名:C, begin notify time=1537252128978
线程名: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. Python之复数、分数、大型数组数学运算(complex、cmath、numpy、fractions)

    一.复数的数学运算 复数可以用使用函数 complex(real, imag) 或者是带有后缀j的浮点数来指定 a=complex(2,4) print(a) # (2+4j) b=2-5j # 获取 ...

  2. 源码包安装Mysql

    特殊原因我需要装在个人用户下 libtool-2.4.2.tar.xz mysql-5.1.37.tar.gz     1.解压libtool-2.4.2.tar.xz tar -xvf libtoo ...

  3. SetDefaultDllDirectories问题

    换台电脑编译报错! 在使用Visual Studio 2013编译程序的时候报以下错误 vc\atlmfc\include\atlcore.h(638): error C2039: “”: 不是“`g ...

  4. 基于mybatis拦截器分表实现

    1.拦截器简介 MyBatis提供了一种插件(plugin)的功能,但其实这是拦截器功能.基于这个拦截器我们可以选择在这些被拦截的方法执行前后加上某些逻辑或者在执行这些被拦截的方法时执行自己的逻辑. ...

  5. Spring IOC 的理解,初始化过程

    在创建ApplicationContext实例对象过程中会创建一个spring容器,该容器会读取配置文件"cn/wuliaokankan/beans.xml",并统一管理由该文件中 ...

  6. 巨好看的xshell配色

    推荐字体Lucida console [FlatUI] text=e5e5e5 cyan(bold)=16a085 text(bold)=ecf0f1 magenta=9b59b6 green=2ec ...

  7. %各位大佬的博客.tql

    线性基:https://www.cnblogs.com/ljh2000-jump/p/5869991.html#4219854 数位DP  https://blog.csdn.net/jk211766 ...

  8. Java奇葩笔试题

    1.下面代码中,在if处填写什么代码,可以使得输出结果为:AB 1 2 3 4 5 6 7 8 9 public static void main(String[] args) { if ( ){// ...

  9. 用JOptionPane类实现各种对话框

    用JOptionPane类实现各种对话框 运行结果: 下面部分参考: JOptionPane类提示框的一些常用的方法 - - ITeye博客  http://847353020-qq-com.itey ...

  10. 并口、串口、COM口区别

          并行接口,简称并口.并口采用的是25针D形接头.所谓“并行”,是指8位数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,数据也 ...