JUC包(面试常问)

1. Callable接口

类似于Runnable接口,Runnable描述的任务,不带返回值;Callable描述的任务带返回值。

public class Test {//创建线程,计算1+2+...+1000public static void main(String[] args) throws ExecutionException, InterruptedException {//使用Callable定义一个任务Callable<Integer> callable = new Callable<Integer>() {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 1; i <= 1000; i++) {sum += i;}return sum;}};//类似于凭小票取餐,这是获取结果的凭证FutureTask<Integer> futureTask = new FutureTask<>(callable);//Thread构造方法不能直接传callable,需要借助futureTaskThread t = new Thread(futureTask);t.start();//获取线程计算结果//get方法会阻塞等待直到call方法计算完毕,get才会返回System.out.println(futureTask.get());}
}

2. ReentrantLock

和synchronized一样是可重入锁,但是两者又有些不同,可以说reentrantLock是对synchronized的补充。
核心方法

  1. lock()加锁
  2. unlock()解锁
  3. tryLock()尝试加锁
和synchronized相比的缺点

进入synchronized内自动加锁,出了synchronized自动解锁。而reentrantLock需要手动加锁,解锁。这就可能出现解锁失败

public static void main(String[] args) {ReentrantLock locker = new ReentrantLock();locker.lock();if(true) {return;}locker.unlock();
}

上面代码直接return没有执行unlock()方法,解决方法就是使用try finally

public static void main(String[] args) {ReentrantLock locker = new ReentrantLock();try {locker.lock();if(true) {return;}} finally {locker.unlock();}
}

和synchronized相比的优点
  1. tryLock尝试加锁,可以设置加锁等待时间。而synchronized采用的是“死等策略”,死等需要慎重。
  2. ReentrantLock可以实现成公平锁,默认是非公平锁
ReentrantLock locker = new ReentrantLock(true);
  1. synchronized是搭配wait/notify实现等待通知机制,随机唤醒一个等待的线程。ReentrantLock是搭配Condition类实现,可以指定唤醒哪个等待的线程。(实例化多个Condition对象,使用await/signal方法)
面试题:谈谈两者的区别

上面的优点+缺点
补充:synchronized是java关键字,底层是JVM实现的;而ReentrantLock是标准库的一个类,底层基于java实现的

3.原子类

原子类的底层是基于CAS实现的,使用原子类,最常见的场景是多线程计数。例如求服务器有多少并发量。

4.信号量Semaphore

信号量相当于一个计数器,表示可用资源的个数。
信号量的基本操作:

  1. P操作,申请一个资源
  2. V操作,释放一个资源

当计数为0的时候,继续P操作,就会阻塞等待到其他线程V操作。
信号量可用视为一个广义的锁,而锁相当于一个可用资源为1的信号量。

public static void main(String[] args) throws InterruptedException {//3个可用资源的信号量Semaphore semaphore = new Semaphore(3);//P操作,申请一个资源semaphore.acquire();System.out.println("p操作");//V操作释放一个资源semaphore.release();System.out.println("V操作");semaphore.acquire();System.out.println("p操作1");semaphore.acquire();System.out.println("p操作2");semaphore.acquire();System.out.println("p操作3");semaphore.acquire();System.out.println("p操作4");}

image.png
发现“p操作4”没有打印,可用资源只有3,前面已经申请3次了,所以没打印,只能阻塞等待到释放资源。

5.CountDownLatch

直译过来就是“计数关闭门阀”,很难理解对吧?举个例子马上让你通透。
5名选手进行百米比赛的时候,当最后一个选手撞线比赛才结束。使用CountDownLatch也是类似,每个选手撞线的时候,就调用countDown方法,当撞线次数达到选手个数,就认为比赛结束。
在举个例子,使用多线程下载一个很大的文件,就切分成多个部分,每个线程负责下载一个部分,当一个线程下载完毕,就调用countDown方法,当所有线程都下载完毕,整个文件就下载完毕。

public static void main(String[] args) throws InterruptedException {//10个选手参加比赛CountDownLatch countDownLatch = new CountDownLatch(5);//创建10个线程来执行任务for (int i = 0; i < 5; i++) {Thread t = new Thread(() -> {System.out.println("选手出发" + Thread.currentThread().getName());try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("选手到达" + Thread.currentThread().getName());//选手撞线countDownLatch.countDown();});t.start();}//阻塞等待,直到所有选手都撞线,才能解除阻塞countDownLatch.await();System.out.println("比赛结束");
}

image.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js/jQuery常见操作 之各种语法例子(包括jQuery中常见的与索引相关的选择器)

js/jQuery常见操作 之各种语法例子&#xff08;包括jQuery中常见的与索引相关的选择器&#xff09; 1. 操作table常见的1.1 动态给table添加title&#xff08;指定td&#xff09;1.1.1 给td动态添加title&#xff08;含&#xff1a;获取tr的第几个td&#xff09;1.1.2 动态加工…

每日一练【三数之和】

一、题目描述 15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可…

【数据结构(九)】线索化二叉树(3)

文章目录 1. 前言——问题引出2. 线索二叉树的基本介绍3. 线索二叉树的应用案例3.1. 思路分析3.2. 代码实现 4. 遍历线索化二叉树4.1. 代码实现 1. 前言——问题引出 问题&#xff1a;     将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树. &#xff08;n17个空指针域&…

1688API接口系列,商品详情数据丨搜索商品列表丨商家订单类丨1688开放平台接口使用方案

1688商品详情接口是指1688平台提供的API接口&#xff0c;用于获取商品详情信息。通过该接口&#xff0c;您可以获取到商品的详细信息&#xff0c;包括商品标题、价格、库存、描述、图片等。 要使用1688商品详情接口&#xff0c;您需要先申请1688的API权限&#xff0c;并获取ac…

老有所依:TSINGSEE青犀养老院智能视频监管方案

养老院智能监控方案是为了提高养老院内老人的安全和护理质量&#xff0c;利用智能技术与监控设备进行全方位的监控和管理&#xff0c;可以加强对老人的监护和护理&#xff0c;提高养老院的服务质量和安全性。 旭帆科技基于视频技术与AI智能分析技术构建的养老院智能视频监控方…

22 FlexSPI—读写外部 SPI NorFlash

文章目录 22.1 SPI 协议简介22.1.1 SPI物理层22.1.2 协议22.1.3 CPOL/CPHA 及通讯模式22.1.4 扩展 SPI 协议22.1.5 SDR 和 DDR 模式 22.2 RT1052 的 FlexSPI 特性及架构22.2.1 RT1052 的 FlexSPI 外设简介22.2.2 RT1052 的 FlexSPI 架构剖析22.2.2.1 通讯引脚22.2.2.2 指令查找…

如何将html网页免费转为excel?

一、直接复制。 直接复制是最简单有效、快捷的解决方案&#xff0c;操作方法如下&#xff1a; 1、用鼠标像平常复制文本一样&#xff0c;将整个网页表格选中。 2、点击右键&#xff0c;点击“复制”。 3、打开excel软件&#xff0c;鼠标点击任意单元格。 4、点击右键&#…

Power BI - 5分钟学习拆分列

每天5分钟&#xff0c;今天介绍Power BI拆分列功能。 什么是拆分列&#xff1f; 有时导入Power BI的数据表中&#xff0c;某列内容都包含同样的特殊字符如 /&/-/_等&#xff0c;可以利用这个特殊字符进行拆分列的操作&#xff0c;获得我们想要的信息。 操作举例&#xf…

SugarCRM 任意文件上传漏洞复现(CVE-2023-22952)

0x01 产品简介 SugarCRM是美国SugarCRM公司的一套开源的客户关系管理系统(CRM)。该系统支持对不同的客户需求进行差异化营销、管理和分配销售线索,实现销售代表的信息共享和追踪。 0x02 漏洞概述 SugarCRM index.php接口存在安全漏洞,该漏洞源于安装组件中存在授权绕过和P…

在线人数(oj题)

题目不少于5个字&#xff0c;所以整了个括号凑字数 首先我想到的是用一个数组来记录每一秒的在线人数 但是即使是short类型&#xff08;2字节&#xff09;&#xff0c;也会用到60 * 60 * 24 * 30 * 12 * 60 * 2 / 1024 / 1024 3,559.5703125 MB 而题目上限是256MB&#xff0…

UE小:UE5性能分析

开始录制性能追踪 要开始录制性能追踪&#xff0c;您可以简单地点击界面上的“开始录制”按钮。 查看追踪数据 录制完成后&#xff0c;点击“Trace”菜单中的“UnrealInsights”选项来查看追踪数据。 使用命令行进行追踪 如果点击录制按钮没有反应&#xff0c;您可以通过命令…

【头歌系统数据库实验】实验4 MySQL单表查询

目录 第1关. 在users表中新增一个用户&#xff0c;user_id为2019100904学号&#xff0c;name为2019-物联网-李明 第2关. 在users表中更新用户 user_id为robot_2 的信息&#xff0c;name设为 机器人二号 第3关. 将solution表中所有 problem_id 为1003 题目的解答结果&#xf…

python源码,在线读取传奇列表,并解析为需要的JSON格式

python源码&#xff0c;在线读取传奇列表&#xff0c;并解析为需要的JSON格式 [Server] ; 使用“/”字符分开颜色&#xff0c;也可以不使用颜色&#xff0c;支持以前的旧格式&#xff0c;只有标题和服务器标题支持颜色 ; 标题/颜色代码(0-255)|服务器标题/颜色代码(0-255)|服务…

使用医学数据集MIMIC,常见的问题记录

目录 MIMIC数据库安装及数据导入教程1.postgresql安装第一步&#xff1a;error running考虑到是不是不同的sql的冲突从报错信息出发重启之后可以安装了 2.打开navicate153.7z 不是内部或外部命令&#xff0c;也不是可运行的程序4.在postgreSQL中输入**\i xxx**命令后遇到提示pe…

2023年9月26日 Go生态洞察:深入解析类型参数

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

2023第十二届“认证杯”D题:CMOS黄昏系数|数学中国数学建模国际赛(小美赛)| 建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍希望大家都能轻松建模呀&#xff0c;数维杯也会持续给大家放送思路滴~ 抓紧小秘籍&#xff0c;我们出发吧~ 来看看认证杯&#xff08;D题&#xff09;&#xff01; 完整内容可以在文章末尾领取&#xff01; 问题重述&#x…

【小红书运营指南1】赛道选择 + 账号运营全周期

小红书运营指南1 写在最前面11.23标签一级标签二级标签 网络资源整理1. 赛道选择近2年小红书女性人群画像 2. 基础认知阶段3. 账号启动阶段4. 选题规划阶段5. 爆款打造阶段6. 涨粉变现阶段涨粉变现阶段粉丝发展阶段 写在最前面 最近做的一个项目调研&#xff0c;调研和实际有一…

Linux基本指令(超详版)

Linux基本指令&#xff08;超详版&#xff09; 1. ls指令2.pwd指令3. cd 指令4.touch指令5mkdir指令6.rmdir指令&&rm指令7.man指令7.cp指令8.mv指令9.echo指令10.cat指令11.more指令12.less指令13.head指令14.tail指令15.date指令16.find指令17.grep指令zip(打包压缩) …

JVM类加载器ClassLoader的源码分析

1、ClassLoader与现有类加载器的关系 ClassLoader与现有类加载器的关系&#xff1a; ClassLoader是一个抽象类。如果我们给定了一个类的二进制名称&#xff0c;类加载器应尝试去定位或生成构成定义类的数据。一种典型的策略是将给定的二进制名称转换为文件名&#xff0c;然后去…

C语言--实现一个函数把一个整数转为它对应的十六进制的字符串

一.题目描述 实现一个函数把一个整数转为它对应的十六进制的字符串。 比如&#xff1a;输入数字1234 输出&#xff1a;4D2 二.思路分析 用一个sprintf函数可以解决问题&#xff0c;输出相对应的字符串 要注意的问题就是&#xff1a;函数结束后要继续使用的内存&#xff08;比如…