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方 ...
随机推荐
- 搭建git服务器遇到的问题
1.错误提示: remote: error: insufficient permission for adding an object to repository database ./objects ...
- dictionary小项目代码管理
软件项目开发流程 需求分析 ----> 概要设计 ---> 项目计划 ---->详细设计--->编码测试 -----> 项目测试 ---->调试修改 ---> ...
- java中wait()和sleep()的区别
前言 以前只知道一个结论,但是没法理解,现在水平上来了,自己代码中写了一个验证的方法. 1.先上结论:wait()会释放持有的锁,sleep()不会释放持有的锁 2.验证:看代码运行结果. packa ...
- linux-redis-install
安装redis3.2.9 wget cd make 编译完成后,将redis-cli redis-server redis-conf redis-benchmark配置文件复制到usr/redis文件 ...
- ActiveMQ安装步骤及介绍
1.什么是ActiveMQ? ActiveMQ是一个完全支持JMS1.1和J2EE1.4规范的JMS Provider实现. JMS相关概念 提供者:实现JMS规范的消息中间件服务器 客户端:发送或接 ...
- Motan框架初体验
1.什么是Motan? Motan是一套基于java开发的RPC框架,除了常规的点对点调用外,motan还提供服务治理功能,包括服务节点的自动发现.摘除.高可用和负载均衡等.Motan具有良好的扩展性 ...
- 本地代码上传至git仓库
1.进入项目文件夹,初始化 git init 2.添加文件到版本库 git add . 3.提交文件 git commit -m "初次提交" 4.关联远程仓库 git remot ...
- 记录 SpringBoot 踩坑经历
1.spring-boot-starter-web 作用 <dependency> <groupId>org.springframework.boot</groupId& ...
- MariaDB PHP语法
MariaDB与各种编程语言和框架(如PHP,C#,JavaScript,Ruby on Rails,Django等)合作良好. PHP仍然是所有可用语言中最受欢迎的语言,因为它的简单性和历史足迹. ...
- 【架构】Linux结构
Linux系统一般有4个主要部分: 内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统.部分层次结构如图1-1所 ...