iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java中信号量模型的实际应用
  • 763
分享到

Java中信号量模型的实际应用

2023-06-17 16:06:51 763人浏览 泡泡鱼
摘要

本篇内容介绍了“Java中信号量模型的实际应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java信号量模型的工作方式如下:线程在运行的过

本篇内容介绍了“Java中信号量模型的实际应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Java信号量模型的工作方式如下:线程在运行的过程中,可以主动停下来,等待某个Java信号量模型的通知;这时候,该线程就进入到该信号量的待召(Waiting)队列当中;等到通知之后,再继续运行。

很多语言里面,同步都由专门的对象表示,对象名通常叫Monitor。同样,在很多语言中,Java信号量模型通常也有专门的对象名来表示,比如,Mutex,Semphore。

Java信号量模型要比同步锁模型复杂许多。一些系统中,信号量甚至可以跨进程进行同步。另外一些信号量甚至还有计数功能,能够控制同时运行的线程数。

我们没有必要考虑那么复杂的模型。所有那些复杂的模型,都是最基本的模型衍生出来的。只要掌握了最基本的信号量模型——“等待/通知”模型,复杂模型也就迎刃而解了。

我们还是以Java语言为例。Java语言里面的同步锁和Java信号量模型概念都非常模糊,没有专门的对象名词来表示同步锁和信号量,只有两个同步锁相关的关键字——volatile和synchronized。

这种模糊虽然导致概念不清,但同时也避免了Monitor、Mutex、Semphore等名词带来的种种误解。我们不必执着于名词之争,可以专注于理解实际的运行原理。

在Java语言里面,任何一个Object Reference都可以作为同步锁。同样的道理,任何一个Object Reference也可以作为Java信号量模型。

Object对象的wait()方法就是等待通知,Object对象的notify()方法就是发出通知。

具体调用方法为

(1)等待某个Java信号量模型的通知

public static final Object signal = new Object();

… f1() {

synchronized(singal) { // 首先我们要获取这个信号量。这个信号量同时也是一个同步锁

// 只有成功获取了signal这个信号量兼同步锁之后,我们才可能进入这段代码

signal.wait(); // 这里要放弃信号量。本线程要进入signal信号量的待召(Waiting)队列

// 可怜。辛辛苦苦争取到手的Java信号量模型,就这么被放弃了

// 等到通知之后,从待召(Waiting)队列转到就绪(Ready)队列里面

// 转到了就绪队列中,离CPU核心近了一步,就有机会继续执行下面的代码了。

// 仍然需要把signal同步锁竞争到手,才能够真正继续执行下面的代码。命苦啊。

需要注意的是,上述代码中的signal.wait()的意思。signal.wait()很容易导致误解。signal.wait()的意思并不是说,signal开始wait,而是说,运行这段代码的当前线程开始wait这个signal对象,即进入signal对象的待召(Waiting)队列。

(2)发出某个Java信号量模型的通知

… f2() {

synchronized(singal) { // 首先,我们同样要获取这个信号量。同时也是一个同步锁。

// 只有成功获取了signal这个信号量兼同步锁之后,我们才可能进入这段代码

signal.notify(); // 这里,我们通知signal的待召队列中的某个线程。

// 如果某个线程等到了这个通知,那个线程就会转到就绪队列中

// 但是本线程仍然继续拥有signal这个同步锁,本线程仍然继续执行

// 嘿嘿,虽然本线程好心通知其他线程,

// 但是,本线程可没有那么高风亮节,放弃到手的同步锁

// 本线程继续执行下面的代码

需要注意的是,signal.notify()的意思。signal.notify()并不是通知signal这个对象本身。而是通知正在等待signal信号量的其他线程。

以上就是Object的wait()和notify()的基本用法。

实际上,wait()还可以定义等待时间,当线程在某Java信号量模型的待召队列中,等到足够长的时间,就会等无可等,无需再等,自己就从待召队列转移到就绪队列中了。

另外,还有一个notifyAll()方法,表示通知待召队列里面的所有线程。这些细节问题,并不对大局产生影响。

“Java中信号量模型的实际应用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Java中信号量模型的实际应用

本文链接: https://www.lsjlt.com/news/290398.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中信号量模型的实际应用
    本篇内容介绍了“Java中信号量模型的实际应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java信号量模型的工作方式如下:线程在运行的过...
    99+
    2023-06-17
  • Java泛型的实际应用
    本篇内容介绍了“Java泛型的实际应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java有很多的高级特...
    99+
    2024-04-02
  • 回车符号 ‘\r’ 的实际应用
    由于最近开始研究自动化测试 首先是自动定时去下载安装包,需要实时显示进度。 于是了解了进度条相关的方法。 作下记录。 区别 \r 表示将光标的位置回退到本行的开头位置 \n 表示光标从下一行的开头位置开始打印 实验环境 python...
    99+
    2023-01-30
    实际应用 符号
  • PHP中单引号和双引号的比较与实际应用
    PHP中单引号和双引号的比较与实际应用 在PHP编程中,使用单引号和双引号都可以用来表示字符串。虽然两者都有相似的作用,但在具体使用中还是有一些区别。本文将从单引号和双引号的区别出发,...
    99+
    2024-03-05
    比较:引号 实际应用:php
  • Golang中的异或符号有哪些实际应用?
    Golang中的异或符具体有什么作用? 异或符号(^)是Golang中的一种二元运算符,用于对两个二进制数进行按位异或运算。在Golang中,异或操作符^可用于整数类型(包括有符号和无符号整数类型)以及布尔类...
    99+
    2024-01-29
    Golang 作用 异或符
  • 数据类型和接口的概念在 Java 框架中的实际应用。
    在 Java 框架中,数据类型和接口是非常重要的概念,它们的正确使用可以大大提升程序的效率和可读性。下面我们就来探讨一下这两个概念在 Java 框架中的实际应用。 一、数据类型在 Java 框架中的实际应用 Java 是一种强类型语言,因此...
    99+
    2023-10-13
    框架 数据类型 接口
  • Java中怎么实现线程间通信与信号量
    Java中怎么实现线程间通信与信号量,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.信号量Semaphore先说说Semaphore,Semaphore可以控制某个资源可...
    99+
    2023-05-30
    java
  • Go语言实战:了解其在实际应用中的力量
    go 是一种功能强大的编程语言,其核心功能包括:出色的并发性,通过协程实现轻量级并发;灵活的接口,定义方法集并实现通用合约;强大的反射机制,用于检视和操作运行时值。 Go语言实战:释放...
    99+
    2024-04-08
    go语言 实战 并发请求
  • Go语言在大型项目中的实际应用探索
    标题:Go语言在大型项目中的实际应用探索 随着互联网技术的迅速发展,越来越多的开发团队开始在大型项目中使用Go语言进行开发。作为一种性能优越、并发性好的编程语言,Go在大型项目中的应用...
    99+
    2024-03-10
    go语言 大型项目 应用探索 社交网络 并发请求 标准库
  • Python递归文件中os模块的实际应用方式
    本篇内容主要讲解“Python递归文件中os模块的实际应用方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python递归文件中os模块的实际应用方式”吧!os模块在实际的操作中应用非常广泛,...
    99+
    2023-06-17
  • HTTP索引中Java对象的实际应用是什么?
    在现代的软件开发中,Java语言已经成为了一种非常流行的语言。Java语言的强大之处在于它支持面向对象的编程,可以将数据和逻辑组织成一个整体。同时,Java语言还拥有非常强大的网络编程能力,可以轻松地实现各种网络通信功能。在Java语言的...
    99+
    2023-09-13
    对象 http 索引
  • Java8中Optional操作的实际应用
    目录简介正文1. Optional是什么2. 没它 VS 有它3. 核心操作4. 应用总结总结简介 目的:Optional的出现主要是为了解决null指针问题,也叫NPE(NullP...
    99+
    2024-04-02
  • 如何探讨Java代理模式与反射机制的实际应用
    如何探讨Java代理模式与反射机制的实际应用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫反射。而代...
    99+
    2023-06-17
  • JavaScript 原型模式的实战:运用其解决实际问题
    JavaScript 原型模式简介 JavaScript原型的模式是面向对象编程的基础,它可以通过原型链的一种方法来实现继承。原型链是一种特殊的对象链接,它允许一个对象访问另一个对象的所有属性和方法。当一个对象访问一个不存在的属性或方法...
    99+
    2024-02-06
    JavaScript 原型 模式 对象 继承 原型链
  • 关于C语言中弱符号与弱引用的实际应用问题
    最近在学习《程序员的自我修养——链接、装载与库》时,get到了一个新的知识点:弱符号与弱引用。书中简短的介绍,让我了解到弱符号的含义以及使用方式。了解我的朋友,应该知道我喜欢将知识...
    99+
    2024-04-02
  • SQL中笛卡尔积的实际应用
    目录1.概念2.sql笛卡尔积语法2.1 表1有2条数据2.2 表2有3条数据2.3 笛卡尔积有6条数据3.sql中的应用总结1.概念 百度百科: 笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian p...
    99+
    2023-03-02
    sql中笛卡尔积是什么 数据库笛卡尔积运算 sql笛卡尔乘积
  • 详解Java信号量Semaphore的原理及使用
    目录1.Semaphore的概述2.Semaphore的原理2.1 基本结构2.2 可中断获取信号量2.3 不可中断获取信号量2.4 超时可中断获取信号量2.5 尝试获取信号量2.6...
    99+
    2024-04-02
  • 重定向在Java开发中的实际应用案例分享?
    重定向是Web开发中非常重要的一项技术,它可以使得网站的页面跳转更加灵活,同时也可以提高网站的安全性。在Java开发中,重定向的实际应用非常广泛,下面我们来分享一些实际应用案例。 用户登录验证 在Web开发中,用户登录验证是非常重要的一...
    99+
    2023-06-02
    重定向 spring numy
  • 索引函数在 Java 中的实际应用场景是什么?
    在 Java 中,索引函数是一个重要的数据结构,它可以提高数据检索的效率。索引函数是一种数据结构,它可以将数据表中的每个记录与一个索引值相对应,这个索引值可以是数据表中的一个属性或多个属性的组合。当我们需要检索数据时,只需要查询索引表,就...
    99+
    2023-09-02
    索引 函数 api
  • C++ 函数模板如何使用并在实际场景中应用?
    函数模板允许您定义可以处理不同类型参数的函数的通用版本。语法为:template,其中 t 是类型参数。要使用函数模板,请指定所需的参数类型,例如:max(10, 20)。函数模板在排序...
    99+
    2024-04-15
    c++ 函数模板
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作