从notify-wait模式说去

2024-05-09 08:08
文章标签 模式 wait notify

本文主要是介绍从notify-wait模式说去,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在java的并发编程之中,有几个比较重要的模式,其中notify-wait的模式显得很重要,因为他是经典的生产者-消费者模式实现的基础,而在生产者-消费者模式上,又可以演变出很多的设计方法,比如java的线程池就是典型的生产者消费者模式,今天就来说一下notify-wait

首先说一下wait在notify之后的的执行逻辑

 

       在Java对象中,有两种池 
       琐池-----------------------synchronized 
       等待池---------------------wait(),notify(),notifyAll() 
       如果一个线程调用了某个对象的wait方法,那么该线程进入到该对象的等待池中(并且已经将锁释放), 
       如果未来的某一时刻,另外一个线程调用了相同对象的notify方法或者notifyAll方法, 
       那么该等待池中的线程就会被唤起,然后进入到对象的锁池里面去获得该对象的锁,  如果获得锁成功后,那么该线程就会沿着wait方法之后的路径继续执行。注意是沿着wait方法之后  

 

 

notify-wait需要在同步的环境下使用,一般套用的方法是:

1,获取对象的锁

2,如果条件不满足,那么调用对象的wait方法,被通知后仍然要检查条件,之所以需要条件检查,是因为被通知后仍然需要获取对象锁,也因此,一般条件检查部分都需要使用while循环来检查

3,条件满足则执行下面对应的逻辑

 

伪码如下:

 

synchronized(对象){

     

      while(条件不满足){

            对象.wait();

     }

对应的处理逻辑

}

 

 通知方遵循的规则如下:

1,获取对象的锁

2,改变现有条件

3,通知所有等待在对象上的线程

synchronized(对象){

    改变条件

    对象.notify();

}

 

话不多说,上代码分析

package com.luchi.threadPoolSimulation;
import java.sql.Connection;
import java.util.LinkedList;
public class ConnectionPool {
private LinkedList<Connection> pool=new LinkedList<>();
public ConnectionPool(int initialSize){
//初始化threadPool
for(int i=0;i<initialSize;i++){
pool.addLast(ConnectionDriver.createConnection());
}
}
public void releaseConnection(Connection conn){ 
if(conn!=null){  
synchronized (pool) {    //获取锁
pool.addLast(conn);  //更改条件
pool.notifyAll();    //通知
}
}
}
public Connection fetchConnection(int mill) throws InterruptedException{
synchronized (pool) {  //获取锁
if(mill<=0){
while(pool.isEmpty()){
pool.wait();
}
return pool.getLast();
}else{
long Future=System.currentTimeMillis()+mill;
long remain=mill;
while(pool.isEmpty() && remain>0){   //循环检查条件
pool.wait(remain);      //条件不满足陷入等待
remain=Future-System.currentTimeMillis();
}
//条件满足或者超时执行下面逻辑
Connection result=null;
if(!pool.isEmpty()){
result=pool.removeFirst();
}
return result;
}
}
}
}

   代码说明:

   代码模拟java的数据库连接池,其中fetchConnection是取connection连接,releaseConnection是释放连接,代码的构造函数初始化了这个connection连接池的大小。

   首先来看一下取连接:

   取连接加入了超时检查模型,也就是说如果在没有取得连接的情况下过了指定的一段时间,将不会再次陷入wait之中而是接着执行(返回null),代码完全遵守之前描述的等待原则,先获取锁,然后循环检查条件,执当检查条件满足或者超时的情况下接着往下面

 

然后再看一下释放连接的releaseCOnnection,同样还是遵循之前描述的模型,获取锁-更改条件-执行逻辑

 

 

 

 了解这这个,下回就可以分析JDK1.7中的线程池的源码了,over。

 

这篇关于从notify-wait模式说去的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/972854

相关文章

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

springboot实战学习(1)(开发模式与环境)

目录 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 (3)前端 二、开发模式 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 Validation:做参数校验Mybatis:做数据库的操作Redis:做缓存Junit:单元测试项目部署:springboot项目部署相关的知识 (3)前端 Vite:Vue项目的脚手架Router:路由Pina:状态管理Eleme

状态模式state

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/state 在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。 在状态模式中,player.getState()获取的是player的当前状态,通常是一个实现了状态接口的对象。 onPlay()是状态模式中定义的一个方法,不同状态下(例如“正在播放”、“暂停

软件架构模式:5 分钟阅读

原文: https://orkhanscience.medium.com/software-architecture-patterns-5-mins-read-e9e3c8eb47d2 软件架构模式:5 分钟阅读 当有人潜入软件工程世界时,有一天他需要学习软件架构模式的基础知识。当我刚接触编码时,我不知道从哪里获得简要介绍现有架构模式的资源,这样它就不会太详细和混乱,而是非常抽象和易

linux 下Time_wait过多问题解决

转自:http://blog.csdn.net/jaylong35/article/details/6605077 问题起因: 自己开发了一个服务器和客户端,通过短连接的方式来进行通讯,由于过于频繁的创建连接,导致系统连接数量被占用,不能及时释放。看了一下18888,当时吓到了。 现象: 1、外部机器不能正常连接SSH 2、内向外不能够正常的ping通过,域名也不能正常解析。