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日

相关文章

  • 黑客如何利用文件包含漏洞进行网站入侵

    黑客通过利用文件包含漏洞,可以轻松地将自己的代码注入到网站服务器中,从而实现对网站的入侵。下面是黑客会使用的一些攻击方法和技术: 使用文件包含漏洞的攻击方法 抓取页面源代码 黑客可以访问页面的URL,并使用一些指定的参数来获取页面的源代码。一旦黑客获取了页面的源代码,就可以查看其中是否存在文件包含漏洞。 判断漏洞类型 黑客可以通过分析页面源代码,判断该漏洞是…

    Java 2023年6月15日
    00
  • mybatis快速入门学习教程新手注意问题小结

    下面是针对“mybatis快速入门学习教程新手注意问题小结”的完整攻略。 1. 简介 MyBatis是一个持久层框架,它可以简化Java对象(POJO)与数据库之间的交互工作。同时,MyBatis还支持调用存储过程和执行高级查询。 在使用MyBatis时,需要注意以下几点: 准确配置MyBatis配置文件 明确SQL语句,并将其写入Mapper 通过Mapp…

    Java 2023年6月1日
    00
  • 浅谈springMVC拦截器和过滤器总结

    以下是关于“浅谈SpringMVC拦截器和过滤器总结”的完整攻略,其中包含两个示例。 SpringMVC拦截器和过滤器总结 SpringMVC拦截器和过滤器是两种常用的Web开发技术,它们可以用于对请求进行拦截和处理。在本文中,我们将讲解SpringMVC拦截器和过滤器的实现原理及用法。 拦截器实现原理 SpringMVC拦截器是一种用于拦截请求的机制。在S…

    Java 2023年5月17日
    00
  • Springboot之整合Socket连接案例

    在Spring Boot应用程序中,我们可以使用Socket连接来实现客户端和服务器之间的通信。以下是实现Spring Boot整合Socket连接的完整攻略: 创建服务器端 在Spring Boot应用程序中,我们可以创建一个服务器端来监听客户端的连接请求。以下是一个示例: @Component public class SocketServer { pr…

    Java 2023年5月15日
    00
  • 如何用java计算两个时间相差多少小时

    下面是如何用Java计算两个时间相差多少小时的完整攻略。 步骤 1.获取两个时间对象 Date beginTime = new Date(); // 开始时间 Date endTime = new Date(); // 结束时间 2.将时间对象转换成时间戳 long beginTimestamp = beginTime.getTime(); // 开始时间戳…

    Java 2023年5月20日
    00
  • 微信小程序实现获取小程序码和二维码java接口开发

    下面是详细讲解“微信小程序实现获取小程序码和二维码java接口开发”的完整攻略。 一、获取小程序码和二维码的区别 在实现获取小程序码和二维码之前,需要了解它们之间的区别。小程序码和二维码都可以用于扫描获取小程序的功能,但它们实现方式和使用场景不同。 小程序码是通过微信提供的wxacode.get接口获取,可以包含小程序的路径、场景值等信息,并且是动态生成的,…

    Java 2023年5月30日
    00
  • 什么是类加载的委派模型?

    简介 Java语言采用的是基于类的面向对象编程思想,当Java程序需要使用一个类时,它会根据类的名称来寻找对应的字节码文件,并将字节码文件加载到JVM中。类加载的委派模型是指,当Java程序需要加载一个类时,先委派父类加载器去加载该类,如果父类加载器无法加载该类,则交给当前类加载器自行加载。 工作原理 类加载的委派模型是Java虚拟机(JVM)用来保证Jav…

    Java 2023年5月10日
    00
  • HttpClient基础解析

    HttpClient基础解析 什么是HttpClient? HttpClient是Apache软件基金会所提供的一个用于处理HTTP请求的第三方库。其提供了方便的API,使得我们可以通过代码实现HTTP请求的发送与响应的接收。 HttpClient的优点 简单易用:HttpClient提供了方便的API,使得我们可以通过简单的代码实现HTTP请求的发送与响应…

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