wait/notify方法
执行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方法的更多相关文章
- java多线程详解(6)-线程间的通信wait及notify方法
Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...
- Java 多线程(七) 线程间的通信——wait及notify方法
线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法: http://docs.oracle.com/ ...
- Java使用wait() notify()方法操作共享资源
Java多个线程共享资源: 1)wait().notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写. 2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线 ...
- 并发编程之 wait notify 方法剖析
前言 2018 元旦快乐. 摘要: notify wait 如何使用? 为什么必须在同步块中? 使用 notify wait 实现一个简单的生产者消费者模型 底层实现原理 1. notify wait ...
- Java中wait()和notify()方法的使用
1. wait方法和notify方法 这两个方法,包括notifyAll方法,都是Object类中的方法.在Java API中,wait方法的定义如下: public final void wait( ...
- 对象的notify方法的含义和对象锁释放的三种情况
1,notify的含义 (1)notify一次只随机通知一个线程进行唤醒 (2)在执行了notify方法之后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁, 要等到 ...
- wait()、notify()方法原理,以及使用注意事项
wait.notify原理 在前面以经说到对象锁的本质,实际上是对象头的一个监视器锁的数据结构.这个结构如下: (图片来源于网络) 几个线程一起竞争对象的锁(enter),只有一个能成功(acquir ...
- Java精通并发-透过openjdk源码分析wait与notify方法的本地实现
上一次https://www.cnblogs.com/webor2006/p/11442551.html中通过openjdk从c++的底层来审视了ObjectMonitor的底层实现,这次继续来探究底 ...
- Java精通并发-notify方法详解及线程获取锁的方式分析
wait(): 在上一次https://www.cnblogs.com/webor2006/p/11404521.html中对于无参数的wait()方法的javadoc进行了解读,而它是调用了一个参数 ...
- Java使用wait() notify()方法操作共享资源详解_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 Java多个线程共享资源: 1)wait().notify()和notifyAll()方法是本地方法,并且为final方 ...
随机推荐
- HDU 1577 WisKey的眼神
WisKey的眼神 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- python杂货
三.字典的基本操作 1.如何访问字典中的值? adict[key] 形式返回键key对应的值value,如果key不在字典中会引发一个KeyError. adict.get(key, default ...
- Java模拟HttpClient进行Get和Post提交
使用Java模拟客户端进行提交,需要用到apache http client jar,这里用的是4.4版本 GET: public void GetURL(){ String strResp=&qu ...
- number框
因为系统的number框无法设置样式,所以休息无聊时写了一个简单的模拟number框的插件,效果不是很完善,有一些功能可能没注意到 // 简单的模拟number框插件 // 布局: // <di ...
- 案例:使用xml存储数据
HTML: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 【知识强化】第五章 输入/输出(I/O)管理 5.1 I/O管理概述
这门课的最后一个章节——设备管理. 操作系统它作为系统资源的管理者,既需要对上层的软件进行管理,也需要对下层的硬件进行管理.操作系统它需要对处理机还有存储器这些硬件进行管理,但是这些硬件其实是在计算机 ...
- Codeforces 1188C DP 鸽巢原理
题意:定义一个序列的beauty值为序列中元素之差绝对值的最小值,现在给你一个数组,问所有长度为k的子序列的beauty值的和是多少? 思路:(官方题解)我们先解决这个问题的子问题:我们可以求出bea ...
- sql对表的操作
--insert into pppcopy select * from ppp //从表ppp中获取数据,并将其插入到pppcopy中,只拷贝表的数据,不拷贝表的结构(前提:表pppcopy1存在) ...
- OpenCV常用基本处理函数(5)图像模糊
2D卷积操作 cv.filter2D() 可以让我们对一幅图像进行卷积操作, 图像模糊(图像平滑)使用低通滤波器可以达到图像模糊的目的.这对与去除噪音很有帮助.其实就是去除图像中的高频成分(比如:噪音 ...
- mui使用总结
mui是一个高性能的HTML5开发框架,从UI到效率,都在极力追求原生体验:这个框架自身有一些规则,刚接触的同学不很熟悉,特总结本文:想了解mui更详细的信息,请访问mui官网 DOM结构 关于mui ...