JUC中的wait与notify方法实现原理详解

JUC中的wait与notify方法实现原理详解

JUC(Java Util Concurrent)是Java中用于处理多线程编程的库,其中包含了大量的线程处理类,其中常用的类之一是Object类中的wait方法和notify方法。本文将详细讲解JUC中的wait与notify方法实现原理。

wait方法的实现原理

wait方法是Object类中的一个方法,表示让线程等待,直到其他线程中断或唤醒该线程。其实现原理是让调用wait方法的线程进入等待队列(WaitSet),并且将线程状态设置为等待状态(WAITING或TIMED_WAITING)。等待队列中的线程等待被唤醒,唤醒机制由notify方法实现。

具体实现过程可以分为下面三个步骤:

1.当前线程进入等待队列,释放当前对象的锁(如果有的话)。

2.当有其他线程调用该对象的notify/notifyAll方法并持有了该对象的锁时,等待队列中的线程就会被唤醒,开始竞争锁。

3.当某个线程竞争成功后会从等待队列中移除,继续执行下面的逻辑。

wait方法的使用示例:

public class WaitTest {
    public synchronized void waitMethod() {
        try {
            System.out.println(Thread.currentThread().getName() + " is waiting");
            Thread.sleep(1000);
            wait(); // 调用wait方法,释放当前对象锁
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public synchronized void notifyMethod() {
        System.out.println(Thread.currentThread().getName() + "开始通知所有等待的线程");
        notifyAll(); // 调用notifyAll方法唤醒等待队列中的所有线程
    }
}

public class WaitNotifyDemo {
    public static void main(String[] args) {
        WaitTest waitTest = new WaitTest();
        Runnable waitTask = () -> waitTest.waitMethod();
        Runnable notifyTask = () -> waitTest.notifyMethod();
        new Thread(waitTask, "线程1").start();
        new Thread(waitTask, "线程2").start();
        new Thread(notifyTask, "线程3").start();
    }
}

notify方法的实现原理

notify方法是Object类中的一个方法,表示唤醒在等待队列中的一个线程,让它可以继续执行,该方法必须在同步方法块或同步方法中使用。其实现原理是通过唤醒等待队列(WaitSet)中的一个线程,该线程从等待队列中移除并重新加入运行队列(RunSet)。

具体实现过程可以分为下面三个步骤:

1.当前线程通知等待队列中的一个线程。

2.通知的线程由等待队列移到运行队列中。

3.线程运行后会经过CPU调度器的调度。

notify方法的使用示例:

public class WaitTest {
    public synchronized void waitMethod() {
        try {
            System.out.println(Thread.currentThread().getName() + " is waiting");
            Thread.sleep(1000);
            wait(); // 调用wait方法,释放当前对象锁
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public synchronized void notifyMethod() {
        System.out.println(Thread.currentThread().getName() + "开始通知等待的线程");
        notify(); // 调用notify方法唤醒等待队列中的一个线程
    }
}

public class WaitNotifyDemo {
    public static void main(String[] args) {
        WaitTest waitTest = new WaitTest();
        Runnable waitTask = () -> waitTest.waitMethod();
        Runnable notifyTask = () -> waitTest.notifyMethod();
        new Thread(waitTask, "线程1").start();
        new Thread(waitTask, "线程2").start();
        new Thread(notifyTask, "线程3").start();
    }
}

以上就是JUC中wait与notify方法实现原理的详细讲解。通过这篇攻略,您可以更深入地了解JUC中的线程处理机制,以便更好地处理多线程编程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JUC中的wait与notify方法实现原理详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 使用java从乱码文本中解析出正确的文本

    当我们从某些旧的应用程序,旧的数据库或旧的操作系统中获取文本数据时,会遇到乱码问题,这些文本数据看起来像是一些无意义的字符混合而成的一串。 使用Java从乱码文本中解析出正确的文本,需要以下几个步骤: 1.了解乱码的产生原因 乱码的产生原因一般有以下几个: 使用不同编码方式进行编码和解码; 编码方式被错误识别; 文件本身损坏或被篡改。 在解决乱码问题时,需要…

    Java 2023年5月20日
    00
  • springsecurity 基本使用详解

    下面我来详细讲解一下“springsecurity 基本使用详解”的完整攻略。 Spring Security 基本使用详解 什么是 Spring Security Spring Security 是针对 Spring 框架的安全性认证框架。也是 Spring Boot 应用中最常用的安全框架之一。它提供了全面的安全性解决方案,以保护应用程序的各个方面,从身…

    Java 2023年5月20日
    00
  • hystrix配置中Apollo与Archaius对比分析

    下面是关于“hystrix配置中Apollo与Archaius对比分析”的完整攻略。 1. 什么是Hystrix Hystrix是一个库,用于隔离远程系统,服务或第三方库,防止它们故障并使自己的应用程序保持连续性,并实现弹性、弹性、监控和回退机制。 2. Hystrix中的配置管理 在Hystrix中,除了默认的配置外,大多数配置都可以在运行时进行更改。Hy…

    Java 2023年6月15日
    00
  • 详解Java中实现SHA1与MD5加密算法的基本方法

    当今网络环境中,安全性是非常重要的一个问题。密码的保护已经成为了一个必须面对的任务。SHA1和MD5是两种常见的加密算法,它们可以将密码字符串加密为一串看似随意的字符,从而实现密码的保护。在Java中,实现SHA1与MD5加密算法有以下基本方法: 1. 使用Java内置的MessageDigest类 MessageDigest是Java提供的安全类之一,它可…

    Java 2023年5月19日
    00
  • spring-transaction源码分析(3)Transactional事务失效原因

    问题概述 在Transactional方法中使用this方式调用另一个Transactional方法时,拦截器无法拦截到被调用方法,严重时会使事务失效。 类似以下代码: @Transactional public void insertBlogList(List<Blog> blogList) { for (Blog blog : blogLis…

    Java 2023年5月11日
    00
  • ibatis结合oracle批量插入三种方法的测评

    针对“ibatis结合oracle批量插入三种方法的测评”的完整攻略,我分步骤详细讲解如下: 1. 背景 在使用ibatis结合oracle进行数据插入时,我们常常会遇到需要批量插入大量数据的情况。为了提高插入效率,我们需要考虑如何优化插入方式。本篇攻略将介绍三种常见的批量插入方法,并进行对比测试。 2. 三种批量插入方法的介绍 2.1 JDBC批量插入 使…

    Java 2023年5月20日
    00
  • SpringMVC开发restful API之用户查询代码详解

    下面我将详细讲解“SpringMVC开发restful API之用户查询代码详解”的完整攻略: 简介 本攻略旨在讲解如何使用SpringMVC框架开发restful API进行用户查询操作。通过本攻略,读者将能够掌握SpringMVC框架开发restful API的基本流程,并了解如何进行用户查询操作。本攻略适合Java开发者学习使用。 准备工作 在开始本攻…

    Java 2023年5月26日
    00
  • java获取当前日期和时间的二种方法分享

    当我们在Java程序中需要获取当前日期和时间时,通常可以使用下面两种常见的方式: 一、使用Java Date类(已过时) Java中的Date类已经被微软官方宣布过时了,不建议使用。不过,这里还是提供一下使用Date类获取当前日期和时间的方式: import java.util.Date; public class GetDateTimeExample { …

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部