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方 ...
随机推荐
- 50.Maximal Square(最大正方形)
Level Medium 题目描述: Given a 2D binary matrix filled with 0's and 1's, find the largest square conta ...
- Groovy学习:第二章 Groovy语言的关键特征
1. 断言Assertion断言:用于判断预期的条件是否为真.例子:def list = [1,2,'x']assert list.size()==32. AST转换期使用的注释AST转换的注释:Gr ...
- js非数值的比较
/** * 非数值的比较: * 1.对于非数值的比较时,会将其转换成数字然后再比较 * 2.如果符号两端是字符串的值进行比较时,不会将其转换为数字进行比较,而是 * 分别比较字符串中的字符的 unic ...
- hibernate 参数一览
实现包含了Hibernate与数据库的基本连接信息的配置方式有两种方式: 第一种是使用hibernate.properties文件作为配置文件. 第二种是使用hibernate.cfg.xml文件作为 ...
- .net Core在过滤器中获取 系统接口方法(以IMemoryCache 为例) 及HttpContext 获取系统接口
public Class SysActionAttribute :Attribute, IActionFilter // Attribute 用于控制器中 特性控制,当在控制器或控 ...
- 2019-9-2-win10-uwp-隐私声明
title author date CreateTime categories win10 uwp 隐私声明 lindexi 2019-09-02 12:57:38 +0800 2018-2-13 1 ...
- 一、bootstrap-select输入选择框
一.bootstrap-select简单使用 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- centos系统jdk安装
下载Oracle官网的jdk来安装 不使用openjdk 最新的官网地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk8- ...
- java23种设计模式(二)-- 建造者模式和原型模式
一.建造者模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创造不同的表示. 特点: (1).在某些属性没有赋值之前,复杂对象不能作为一个完整的产品使用.比如汽车包括方向盘.车门.发动机 ...
- c# 定义operator运算符
public void TestFunc() { Complex complex1 = new Complex(); Complex complex2 = new Complex(); var s = ...