JUC(java.util.concuurrent)的常见类介绍
Java 并发包(java.util.concurrent,简称 JUC)提供了一系列的工具和框架,用于简化并发编程。以下是 JUC 包中常见类的介绍:
-
Callable:
Callable接口是 Java 提供的一个带返回值的任务接口,类似于Runnable接口,但是它可以在执行结束后返回一个结果,也可以抛出异常。通常与ExecutorService结合使用,可以提交给线程池执行。public class CallableUse {public static void main(String[] args) {//第一种写法FutureTask<Integer> futureTask1 = new FutureTask<Integer>(new Callable<Integer>() {public Integer call() {int sum = 0;for (int i = 0; i < 1001; i++) {sum += i;}return sum;}});Thread thread = new Thread(futureTask1);thread.start();//第二种写法Callable<Integer> callable = new Callable<Integer>() {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 0; i < 1001; i++) {sum += i;}return sum;}};FutureTask<Integer> futureTask2 = new FutureTask<>(callable);Thread thread2 = new Thread(futureTask2);thread2.start();} }实现
Callable接口的类必须实现call()方法,该方法定义了需要执行的任务,并可以返回一个结果。通过ExecutorService的submit(Callable)方法提交一个Callable任务,返回一个Futuretask对象,可以通过该对象获取任务执行的结果
-
ReentrantLock:
ReentrantLock是一种可重入锁,它提供了与synchronized关键字相同的功能,即确保代码块在同一时刻只有一个线程执行,但相比synchronized更灵活,例如它支持公平性和非公平性,以及可中断性等特性。import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {private static final Lock lock = new ReentrantLock();public static void main(String[] args) {new Thread(() -> {lock.lock();try {System.out.println("Thread 1 acquired the lock");Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}).start();new Thread(() -> {lock.lock();try {System.out.println("Thread 2 acquired the lock");} finally {lock.unlock();}}).start();} }相对于synchronized,优势有三:
-
其提供了trylock(超过时间):加锁,如果得不到锁对象,一段时间后放弃加锁。
-
可以是公平锁,在构造方法new ReentrantLock();可以给一个true开启
-
更加强大的唤醒机制,synchronized基于锁的wait与notify,唤醒的线程随机,reentrantlock可以搭配Condition类实现唤醒,可以唤醒指定线程
-
- 使用
ReentrantLock的典型操作包括:- 调用
lock()方法获取锁。 - 在
try-finally块中执行需要保护的临界区代码。 - 调用
unlock()方法释放锁。
- 调用
- 可以使用
ReentrantLock的tryLock()方法尝试获取锁而不阻塞,或者使用lockInterruptibly()方法在获取锁的过程中可以响应中断
-
原子类:
- JUC 提供了一系列的原子类,如
AtomicInteger、AtomicLong、AtomicBoolean等,它们提供了一种线程安全的方式来进行原子操作,保证了操作的原子性。这些类底层使用了 CAS(Compare And Swap)操作来保证线程安全,常用于需要高效并发操作的场景。详见文章常见锁策略,synchronized内部原理以及CAS-CSDN博客
- JUC 提供了一系列的原子类,如
-
线程池:
- 线程池是管理线程的一种机制,它可以重用已创建的线程,减少了线程创建和销毁的开销,并且可以控制并发线程的数量。JUC 提供了
ThreadPoolExecutor类来实现线程池,也提供了一些方便的工厂方法,如Executors.newFixedThreadPool()、Executors.newCachedThreadPool()等来创建不同类型的线程池。详见文章Java线程池 ThreadPoolExecutor, Executor-CSDN博客
- 线程池是管理线程的一种机制,它可以重用已创建的线程,减少了线程创建和销毁的开销,并且可以控制并发线程的数量。JUC 提供了
-
Semaphore:
Semaphore是一种计数信号量,它可以限制同时访问某个资源的线程数量。它维护了一定数量的许可证,每次线程访问资源前需要获取许可证,如果许可证数量不足,则线程将被阻塞。一旦线程使用完资源,它将释放许可证,使得其他线程可以继续访问资源。import java.util.concurrent.Semaphore;public class SemaphoreExample {private static final Semaphore semaphore = new Semaphore(2);public static void main(String[] args) {for (int i = 0; i < 5; i++) {new Thread(() -> {try {semaphore.acquire();System.out.println("Thread acquired semaphore");Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} finally {semaphore.release();System.out.println("Thread released semaphore");}}).start();}} }Semaphore的典型操作包括:调用acquire()方法获取一个许可证,如果没有可用的许可证则会阻塞。在try-finally块中执行需要获取许可证保护的代码。调用release()方法释放一个许可证。(PV操作)
-
CountDownLatch:
CountDownLatch是一种同步工具,它可以使一个或多个线程等待其他线程执行完特定操作后再继续执行。它通过一个计数器来实现,当计数器减为零时,等待的线程可以继续执行。CountDownLatch常用于实现线程之间的协调和同步。public class CountDownLatchUse {public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(10);for (int i = 0; i < 10; i++) {Thread thread = new Thread(()->{int delay = (int) (Math.random()*10000+1000);try {Thread.sleep(delay);} catch (InterruptedException e) {throw new RuntimeException(e);}countDownLatch.countDown();System.out.println(Thread.currentThread().getId());});thread.start();}countDownLatch.await();System.out.println("the end");} }CountDownLatch的典型操作包括:- 创建
CountDownLatch对象时指定初始计数器值。 - 在需要等待的线程调用
await()方法等待计数器归零。 - 在其他线程中执行操作完成后,调用
countDown()方法递减计数器。
- 创建
- 可以通过
await(long timeout, TimeUnit unit)方法设置等待超时时间,或者通过getCount()方法获取当前计数器值。
综上一些方式,都是为了解决多线程下线程安全以及提高效率的方式。
相关文章:
JUC(java.util.concuurrent)的常见类介绍
Java 并发包(java.util.concurrent,简称 JUC)提供了一系列的工具和框架,用于简化并发编程。以下是 JUC 包中常见类的介绍: Callable: Callable 接口是 Java 提供的一个带返回值的任务接口,类似于…...
【中科院计算所】WSDM 2024冠军方案:基于大模型进行多文档问答
作者:李一鸣 张兆 中科院计算所 会话式多文档问答旨在根据检索到的文档以及上下文对话来回答特定问题。 在本文中,我们介绍了 WSDM Cup 2024 中“对话式多文档 QA”挑战赛的获胜方法,该方法利用了大型语言模型 (LLM) 卓越的自然语言理解和生…...
Android提供了多种方式来打开特定文件夹中的视频
使用 MediaStore获取指定文件夹的视频,更优化方法: import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.net.Uri; import android.os.Build; import android.os.Environme…...
基于django的购物商城系统
摘要 本文介绍了基于Django框架开发的购物商城系统。随着电子商务的兴起,购物商城系统成为了许多企业和个人创业者的首选。Django作为一个高效、稳定且易于扩展的Python web框架,为开发者提供了便捷的开发环境和丰富的功能模块,使得开发购物商…...
Swagger3 使用详解
Swagger3 使用详解 一、简介1 引入依赖2 开启注解3 增加一个测试接口4 启动服务报错1.5 重新启动6 打开地址:http://localhost:8093/swagger-ui/index.html 二、Swagger的注解1.注解Api和ApiOperation2.注解ApiModel和ApiModelProperty3.注解ApiImplicitParams和Api…...
JVM 第二部分-2(堆,方法区)
4.堆 堆 一个Java程序(main方法)对应一个jvm实例,一个jvm实例只有一个堆空间堆是jvm启动的时候就被创建,大小也确定了。大小可以用参数设置。堆是jvm管理的一块最大的内存空间 核心区域,是垃圾回收的重点区域堆可以位…...
蓝桥杯Java B组历年真题(2013年-2019年)
一、2013年真题 1、世纪末的星期 使用日期类判断就行,这里使用LocalDate,也可以使用Calendar类 答案 2099 使用LocalDate import java.time.LocalDate; import java.time.format.DateTimeFormatter; // 1:无需package // 2: 类名必须Main, 不可修改p…...
你是谁,便会遇见谁
就会进什么样的圈子。努力提升自己,才是提升阶层最可靠的方法。 在人生的舞台上,每一个人都是自己人生的主角。而在这个旅程中,我们会遇见各种各样的人,进入不同的社交圈子。正如一句古训所说:“你是谁,便…...
Linux/Centos 部署静态IP,解决无法访问目标主机、Destination Host Unreachable、无法ping通互联网的问题
Linux/Centos 部署IP,解决无法访问目标主机、Destination Host Unreachable、无法ping通互联网的问题 Linux/Centos 部署静态IP查物理机/自身电脑的IP设置VMware上的虚拟网络编辑器设置网卡IP,激活至此就可访问百度了 Linux/Centos 部署静态IP 需要注意…...
在学习云原生的时候,一直会报错ImagePullBackOff Back-off pulling image
在学习云原生的时候,一直会报错 (见最后几张图) ImagePullBackOff Back-off pulling image 然后我就在像。这个配置的镜像是不是可以自己直接下载,但是好像不怎么搜索得到 然后就在想,这个lfy_k8s_images到底是个啥玩…...
Android Activity跳转详解
在Android应用程序中,Activity之间的跳转是非常常见的操作,通过跳转可以实现不同界面之间的切换和交互。在本篇博客中,我们将介绍Android中Activity跳转的相关知识,包括基本跳转、传递参数、返回数据以及跳转到浏览器、拨号应用和…...
计算机网络(2)-----数据链路层
目录 一.数据链路层的基本概念 二.数据链路层的功能概述 功能一:为网络层提供服务。无确认无连接服务,有确认无连接服务,有确认面向连接服务。 功能二:链路管理,即连接的建立、维持、释放(用于面向连接的服务)。 功能三:组帧 透明传输:…...
贪心算法(算法竞赛、蓝桥杯)--修理牛棚
1、B站视频链接:A27 贪心算法 P1209 [USACO1.3] 修理牛棚_哔哩哔哩_bilibili 题目链接:[USACO1.3] 修理牛棚 Barn Repair - 洛谷 #include <bits/stdc.h> using namespace std; const int N205; int m,s,c,ans; int a[N];//牛的位置标号 int d[N…...
【AIGC】微笑的秘密花园:红玫瑰与少女的美好相遇
在这个迷人的画面中,我们目睹了一个迷人的时刻,女子则拥有一头柔顺亮丽的秀发,明亮的眼睛如同星河般璀璨,优雅而灵动,她的微笑如春日暖阳,温暖而又迷人。站在红玫瑰花瓣的惊人洪水中。 在一片湛蓝无云的晴…...
vue3 中 主题定制
vue3 中 主题定制 背景 做多主题定制,黑/白 ,里面还要再分各种颜色,每次进来都要记住上次的主题设置 效果图 一、目录结构 ├── generated │ ├── theme │ │ └── dark-yellow.ts │ │ └── dark-orange.ts │ │…...
数据分析之Logistic回归分析(二元逻辑回归、多元有序逻辑回归、多元无序逻辑回归)
1、Logistic回归分类 在研究X对于Y的影响时: 如果Y为定量数据,那么使用多元线性回归分析;如果Y为定类数据,那么使用Logistic回归分析。 结合实际情况,可以将Logistic回归分析分为3类: 二元Logistic回归…...
【c++】通讯录管理系统
1.系统功能介绍及展示 2.创建项目 3.菜单实现 4.退出功能实现 5.添加联系人—结构体设计 6.添加联系人—功能实现 7.显示联系人 8.删除练习人—检测联系人是否存在 9.删除联系人—功能实现 10.查找联系人 11.修改联系人 12.清空通讯录 #include <iostream> #include <…...
Tomcat 架构
一、Http工作原理 HTTP协议是浏览器与服务器之间的数据传送协议。作为应用层协议,HTTP是基于TCP/IP协议来传递数据的(HTML文件、图片、查询结果等),HTTP协议不涉及数据包(Packet)传输,主要规定了…...
Spring 整合mybatis
目录 1、梳理整合思路 2、整合实现 2.1 环境搭建 2.2 案例 1、梳理整合思路 将MyBatis的DataSource交给Spring IoC容器创建并管理,使用第三方数据库连接池(Druid,C3P0等)代替MyBatis内置的数据库连接池将MyBatis的SqlSessionFactory交给Spring IoC容…...
centos7升级openssl_3
1、查看当前openssl版本 openssl version #一般都是1.几的版本2、下载openssl_3的包 wget --no-check-certificate https://www.openssl.org/source/old/3.0/openssl-3.0.3.tar.gz#解压 tar zxf openssl-3.0.3.tar.gz#进入指定的目录 cd openssl-3.0.33、编译安装遇到问题缺…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
