深入了解Semaphore、CountDownLatch等实用工具的用法

哈喽,各位小伙伴们,你们好呀,我是喵手。

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  在现代软件开发中,使用并发工具类是实现高效多线程编程的关键。本文将深入介绍Java中一些常用的并发工具类,如Semaphore、CountDownLatch等,帮助读者深入了解并掌握它们的用法和应用场景。

摘要

  本文将全面解析Java中一些常用的并发工具类,如Semaphore、CountDownLatch等。通过源代码解析、应用场景案例、优缺点分析、类代码方法介绍和具体的Java代码测试用例,读者将深入了解和应用这些实用的并发工具类。

简介

  在本节中,我们将介绍Java中一些常用的并发工具类的重要性和作用。我们将概述这些工具类的基本概念和使用场景,为后续的源代码解析做好准备。

源代码解析

  通过源代码解析,我们将深入研究Java中一些常用的并发工具类的底层实现和核心原理。我们将详细解释Semaphore、CountDownLatch等工具类的用法和使用注意事项。

应用场景案例

  本节将提供一些实际应用场景的案例,展示Java中并发工具类的灵活应用。我们将深入探讨并发情境下使用Semaphore、CountDownLatch等工具类的场景和解决方案。

优缺点分析

  在本节中,我们将分析Java并发工具类的优点和缺点。我们将讨论使用这些工具类带来的性能优势、代码复杂性以及可能存在的竞态条件等问题。

类代码方法介绍

  本节将详细介绍Java中与并发工具类相关的类和方法。我们将重点介绍Semaphore、CountDownLatch等工具类的构造方法、核心方法和常用技巧。

具体的Java代码测试用例

  为了验证并发工具类的正确性和性能,我们将编写具体的Java代码测试用例。通过模拟并发场景,观察并发工具类的行为和效果。

package com.example.javase.ms.threadDemo;

import java.util.concurrent.Semaphore;

/**
 * @Author ms
 * @Date 2023-12-16 18:05
 */
public class SemaphoreExample {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(3);

        Thread t1 = new Thread(new Task(semaphore, "Thread 1"));
        Thread t2 = new Thread(new Task(semaphore, "Thread 2"));
        Thread t3 = new Thread(new Task(semaphore, "Thread 3"));
        Thread t4 = new Thread(new Task(semaphore, "Thread 4"));

        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }

    static class Task implements Runnable {
        private Semaphore semaphore;
        private String name;

        public Task(Semaphore semaphore, String name) {
            this.semaphore = semaphore;
            this.name = name;
        }

        @Override
        public void run() {
            try {
                semaphore.acquire();
                System.out.println(name + " acquired a permit");
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release();
                System.out.println(name + " released a permit");
            }
        }
    }
}

测试结果展示:

根据如上测试用例,我本地执行结果如下:

image.png

代码解析:

  如下针对上述测试代码,给大家具体讲解下,仅供参考:针对如上代码演示了使用Semaphore类实现并发控制的示例。

  Semaphore是一种计数信号量,用于控制同时访问某个资源的线程数量。在main方法中,创建了一个Semaphore对象,初始计数为3。然后创建了4个线程t1、t2、t3、t4,并分别传入Semaphore对象和线程名作为参数创建Task对象。Task类实现了Runnable接口,在run方法中,首先调用semaphore.acquire()方法获取一个许可,如果没有许可可用,则线程将阻塞。然后打印线程名,并调用Thread.sleep方法模拟线程执行任务的耗时。最后调用semaphore.release()释放一个许可。运行结果可能会有所不同,但大致上是在开始时Thread 1、Thread 2、Thread 3依次获取许可,然后Thread 4等待,当Thread 1释放许可后,Thread 4获取许可并执行任务。Semaphore的主要方法有acquire()、release()和availablePermits()。acquire()方法获取一个许可,如果没有可用的许可,则线程将阻塞。release()方法释放一个许可。availablePermits()方法返回当前可用的许可数量。Semaphore可以用于实现资源池、连接池、限流等并发控制场景。

全文小结

  在本节中,我们对全文的内容进行了小结,强调通过学习并应用Java中的并发工具类,帮助读者实现高效且安全的多线程编程。

总结

  通过本文的学习,我们深入了解了Java中一些常用的并发工具类,如Semaphore、CountDownLatch等。掌握并应用这些工具类对于实现高效、并发安全的多线程应用程序至关重要。我们鼓励读者深入学习和实践这些实用的并发工具类,并应用于实际开发中。

  希望本文能够帮助大家全面理解和应用Java中的并发工具类,提升多线程编程技能和质量,并构建出高性能和可靠性的多线程应用程序,只有能够帮助到同学们,我分享文章的意义也就有了。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/576630.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4月26(信息差)

🌍 1170万台 华为跃升重回首位!苹果跌至第五位 🎄工业软件大事件 —— OGG 1.0 发布,华为贡献全部源代码 ✨ 苹果发布 OpenELM:专为在设备端运行而设计的小型开源 AI 模型 1.FisheyeDetNet:首个基于鱼眼相…

LED驱动模块RSC6218A 5W-18W迷你高效驱动电源应用-REASUNOS(瑞森半导体)

一、LED驱动模块RSC6218A REASUNOS(瑞森半导体)通过持续投入研发,提升LLC应用技术,集成控制芯片与功率转换,成功推出新一代产品RSC6218A WSOP-16,延续瑞森LLC拓扑方案,时机趋势完全迎合我国双碳政策,电气特…

【Web】DASCTF X GFCTF 2024|四月开启第一局 题解(全)

目录 EasySignin cool_index SuiteCRM web1234 法一、条件竞争(没成功) 法二、session反序列化 EasySignin 先随便注册个账号登录,然后拿bp抓包改密码(username改成admin) 然后admin / 1234567登录 康好康的图片功能可以打SSRF,不能直接读本地文…

Docker网络模式与cgroup资源控制

前言 在 Docker 中,网络模式和 cgroup 资源控制作为关键功能,对于容器的性能优化和资源管理起着至关重要的作用。本文将介绍 Docker 的网络模式和cgroup资源控制,探讨不同网络模式的特点以及如何利用 cgroup 资源控制机制来有效管理容器的资…

不使用加减运算符实现整数加和减

文章目录 进位 进位 加粗 最近想出了不适用运算符实现加与减 首先按位与找出的是需不需要进位 按位与是两边同时为1,则为1,那么如果两边同时为1的话,是不是就该进位?所以我们用按位与来判断是否需要进位 然后再按位异或找出不同的位数 按位异或是两边不相等,也就是1 和 0的时…

SpringBoot源码阅读2-自动配置

SpringBoot源码阅读2-自动配置 在传统的Spring应用中,开发者需要手动配置一系列Web应用的核心组件,例如DispatcherServlet用于处理请求分发、ViewResolver用于视图解析、CharacterEncodingFilter用于字符编码过滤等。 然而在SpringBoot中只要引入了spr…

力扣HOT100 - 994. 腐烂的橘子

解题思路: 因为要记录轮数(分钟数),所以不能一口气遍历到底,所以不能用深搜(bfs),而要用广搜(bfs,层序遍历)。 先记录下新鲜橘子数,…

github+PicGo+obsidian来作为你的免费高效可靠图床吧

前提 一直以来 博客的图床问题都是个大问题 ,如何找到一个 可靠并且 方便的搭建方式 非常重要 今天介绍一种 githubpicGoobsidian的搭建方式 准备github库 生成个人github token 找到个人 设置 生成一个新token 或者已经有的直接用 新生成的token 需要记录下来 这可能是你最后…

在若依Ruoyi-Vue中集成mybatisplus实现mybatis增强

本文相关视频:https://www.bilibili.com/video/BV1Fi4y1q74p?p50&vd_source2894aa0e46c09ba98269f266128b6c6e 若依(Ruoyi)作为一款优秀的基于Spring Boot和Vue.js的企业级后台管理系统,其良好的架构设计和丰富的功能组件深…

13.JAVAEE之HTTP协议

HTTP 最新的版本应该是 HTTP/3.0 目前大规模使用的版本 HTTP/1.1 使用 HTTP 协议的场景 1.浏览器打开网站 (基本上) 2.手机 APP 访问对应的服务器 (大概率) 学习 HTTP 协议, 重点学习 HTTP 的报文格式 前面的 TCP/IP/UDP 和这些不同, HTTP 的报文格式,要分两个部分来看待.请求…

C# WinForm —— 10 单选按钮与复选框的介绍与使用

单选按钮 RadioButton 一组单选按钮中,只能选择一个,互相排斥 常用属性、事件: 属性用途(Name)单选按钮的ID,在代码里引用的时候会用到,一般以 rb开头Text单选按钮旁边显示的 文本信息Checked单选按钮的勾选状态Appearance控制单…

数据结构:最小生成树(Prim算法和Kruskal算法)、图的最短路径(Dijkstra算法和Bellman-Ford算法)

什么是最小生成树?Prim算法和Kruskal算法是如何找到最小生成树的? 最小生成树是指在一个连通图中,通过连接所有节点并使得总权重最小的子图。 Prim算法和Kruskal算法是两种常用的算法,用于寻找最小生成树。 Prim算法的步骤如下&…

通过 QEMU 试用 ESP32-C3 的安全功能

概述 ESP32-C3 系列芯片支持可信启动、flash 加密、安全存储等多种安全功能,还有专用外设来支持 HMAC 和数字签名等用例。这些功能所需的私钥和配置大多存储在 ESP32-C3 的 eFuse 存储器中。 启用安全功能时需要谨慎,因为使用到的 eFuse 存储器是一次…

实现SpringMVC底层机制(二)

文章目录 1. 动态获取spring配置文件1.修改SunWebApplicationContext.java2.修改SunDispatcherServlet.java 2.自定义Service注解1.需求分析2.编写Monster.java3.自定义Service注解4.编写Service接口MonsterService.java5.编写Service实现类MonsterServiceImpl.java6.修改SunWe…

数据结构系列-二叉树之前序遍历

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 这篇文章,我们主要的内容是对二叉树当中的前历的算法进行讲解,二叉树中的算法所要求实现的是 从根到左子树再到右子树的遍历顺序,可能这样不太…

C语言--基础面试真题

1、局部变量和静态变量的区别 普通局部变量和静态局部变量区别 存储位置: 普通局部变量存储在栈上 静态局部变量存储在静态存储区 生命周期: 当函数执行完毕时,普通局部变量会被销毁 静态局部变量的生命周期则是整个程序运行期间&#…

程序员学CFA——数量分析方法(四)

数量分析方法(四) 常见概率分布基本概念离散型随机变量与连续型随机变量离散型随机变量连续型随机变量 分布函数概率密度函数(PDF)累积分布函数(CDF) 离散分布离散均匀分布伯努利分布二项分布定义股价二叉树…

Rabbitmq安装延迟插件rabbitmq_delayed_message_exchange失败

Docker里的Rabbitmq容器安装延迟插件rabbitmq_delayed_message_exchange失败 一启动插件Rabbitmq容器直接停止运行了 rabbitmq-plugins enable rabbitmq_delayed_message_exchange排除了版本问题和端口问题等,发现是虚拟机运行内存不够,增加虚拟机运行内…

python基础——正则表达式

📝前言: 这篇文章主要想讲解一下python中的正则表达式: 1,什么是正则表达式 2,re模块三匹配 3,元字符匹配 4,具体示例 🎬个人简介:努力学习ing 📋个人专栏&am…

Hybrid Homomorphic Encryption:SE + HE

参考文献: [NLV11] Naehrig M, Lauter K, Vaikuntanathan V. Can homomorphic encryption be practical?[C]//Proceedings of the 3rd ACM workshop on Cloud computing security workshop. 2011: 113-124.[MJS16] Maux P, Journault A, Standaert F X, et al. To…
最新文章