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方 ... 
随机推荐
- springCloud的使用04-----熔断器hystrix的使用
			1. restTemplate+ribbon使用hystrix 1.1 引入依赖 <!-- 配置hystrix断路器 --> <dependency> <groupId& ... 
- java虚拟机规范(se8)——class文件格式(六)
			4.7.4 StackMapTable 属性 StackMapTable 属性是一个变长属性,位于 Code(§4.7.3)属性的属性表中.这个属性会在虚拟机类加载的类型阶段(§4.10.1)被使用. ... 
- Centos7 部署ftp
			1.查看是否已经安装 vsftpd -version 2.安装vsftpd yum install -y vsftpd 3.新建FTP目录 mkdir /data/KodServer/data/Use ... 
- 前端学习(二十七)存储&es6(笔记)
			cookie 存储 以站点为单位的. 必须配合服务器环境 不能跨浏览器 cookie有生命周期 默认是session session ... 
- jenkins发送邮箱配置,出现Error sending to the following VALID addresses,解决方案
			Jenkins发送邮箱配置,需要的插件:Extended E-mail Notification,邮件通知 1.Manage Jenkins -> Configure System 2.下图是“ ... 
- Future模式的简单实现
			/** * 数据接口 */ public interface Data { public String getResult(); } /** * 最终需要使用的数据模型 */ public class ... 
- 04.join与interrupt
			join加入 public class JoinDemo { public volatile static int i = 0; public static class AddThread exten ... 
- nodejs  npm 常用配置
			npm install moduleNames : 安装 Node 模块.node安装分为全局模式和本地模式. npm install -g moduleName.npm install expres ... 
- Hadoop(一)阿里云hadoop集群配置
			集群配置 三台ECS云服务器 配置步骤 1.准备工作 1.1 创建/bigdata目录 mkdir /bigdatacd /bigdatamkdir /app 1.2修改主机名为node01.node ... 
- nucleus学习
			task的TCB结构: typedef struct TC_TCB_STRUCT { /* Standard thread information first. This information is ... 
