JUC介绍

news2024/9/22 8:21:48

一、并发与并行

1.并发

早期计算机CPU是单核的,为了提高CPU的利用率,减少等待时间,使用到了并发工作的理论
并发就是将CPU资源合理分配给多个任务,当一个任务执行I/O操作时,转去执行其他任务
请添加图片描述

2.并行

针对多核CPU,有了并行的工作方法,并行就是多核CPU同时独立执行一个任务,而且多个任务互不干扰
请添加图片描述

二、进程与线程

1.进程

指系统中正在运行的一个应用程序的一个实例

2.线程

一个进程中存在多个线程,是程序执行的最小单位
线程的状态:

  1. NEW(新建)
    线程对象已经创建,但未运行
  2. RUNNABLE(可运行)
    线程已启动,准备运行
  3. BLOCKED(阻塞)
    线程试图获取已被持有的锁,会被阻塞直到被释放
  4. WAITING(等待)
    线程无限期处于等待状态,等待其他线程执行特定动作
  5. TIMED_WAIING(限时等待)
    线程处于有限期等待状态,等待其他线程执行特定动作或者时间间隔
  6. TERMINATED(终止)
    线程执行完或因异常被终止

三、wait和sleep的区别

1.使用方式

wait() 方法属于Object类
sleep() 方法属于Thread方法,静态方法

2.对锁的影响

wait() 方法会释放锁
sleep() 方法不会释放锁

3.唤醒方式

wait() 方法需要手动唤醒 notify() 或 notifyAll()
sleep() 方法自动唤醒

四、JUC中的原子类

1.基本类型原子类

1)Atomiclnteger 整型原子类

主要方法:

  • get() :获取当前值
  • set(int newValue) :设置当前值
  • incrementAndGet() :自增当前值并返回结果
  • decrementAndGet() :自减当前值并返回结果
  • getAndIncrement() :自增当前值并返回原值
  • getAndDecrement() :自减当前值并返回原值
  • addAndGet(int delta) :当前值加上指定值并返回结果
  • getAndAdd(int delta) :当前值加上指定值并返回原值
  • compareAndSet(int expect, int updater) :如果当前值为预期值,则将当前值设置为更新值,否则返回false

2)AtomicLong 长整型原子类
主要方法与AtomicInteger类似,处理的是64位长整型值

3)AtomicReference 引用类型原子类
可以存储任何类型对象,可以用来创建复杂的原子数据结构,如原子对列,栈等

4)AtomicBoolean 布尔型原子类
提供了线程安全的布尔值更新

2.原子数组

AtomicIntegerArray 整型原子数组
AtomicLongArray 长整型原子数组
AtomicReferenceArray 引用类型原子数组
常用方法

  • get(index) :返回指定索引处的值
  • compareAndSet(index, expectedValue, newValue) :如果指定索引处的值为预期值,则设置为给定的新值
  • getAndIncrement(index) :指定索引处自增返回旧值
  • getAndDecrement(index): 指定索引处的值自减返回旧值
  • getAndAdd(index, delta): 指定索引处的值加上给定的增量并返回旧值
  • addAndGet(index, delta): 指定索引处的值加上给定的增量并返回新值

3.计数器(LongAdder)

主要用于需要的频繁更新和读取的大量数据并发场景,使用无锁技术以及基于分段的技术器实现高性能的原子操作,性能比AtomicLong高

方法:

  • add(long x) :增加指定值
  • increment() :自增
  • decrement() :自减
  • reset() :重置计数器
  • sum() :获取当前总和

五、JUC包中的辅助类

1.CountDownLatch

允许一个或多个线程等待其他线程完成某些操作,当计数器的值减为零时,所有等待的线程被释放

主要方法:

  • 构造函数CountDownLatch(int coun):构造一个带有指定技术的CountDownLatch实例
  • countDown() :每次调用方法计数减一
  • await() :阻塞当前线程,直到计数为0或超时

2.CyclicBarrier 同步辅助类

可以让多个线程互相等待,直到所有线程到达屏障点

主要方法:

  1. 构造方法:
  • CyclicBarrier(int parties): 创建一个新的 CyclicBarrier,参数 parties 指的是需要等待的线程数量。
  • CyclicBarrier(int parties, Runnable barrierAction): 与第一个构造函数类似,但当所有线程都到达屏障时,会有一个额外的Runnable 任务被执行
  1. 成员方法
  • await():阻塞当前线程,直到所有参与的线程都调用了此方法。
  • reset(): 重置屏障,取消所有正在等待的线程。
  • getParties(): 返回屏障的参与者数量。
  • isBroken(): 返回一个布尔值表示屏障是否已被中断或超时。

3.Semaphore 信号量

用于控制同时访问某个资源的线程数量。它的本质是一个“共享锁“。

主要方法:

  1. 构造函数:
  • Semaphore(int permits):创建一个具有给定数量许可的 Semaphore。
  • Semaphore(int permits, boolean fair):创建一个具有给定数量许可的 Semaphore,并且可以选择是否公平分配许可。
  1. 获取许可:
  • acquire():等待直到获取一个许可,如果所有许可都被占用,则线程将被阻塞。
  • acquireUninterruptibly():等待直到获取一个许可,即使线程被中断也不会抛出异常。
  • tryAcquire():尝试获取一个许可,如果许可可用则立即返回 true,否则返回 false。
  • tryAcquire(long timeout, TimeUnit unit):尝试在给定时间内获取一个许可,如果在超时时间内许可可用则立即返回 true,否则返回 false。
  1. 释放许可:
  • release():释放一个许可,增加可用的许可数量。
  1. 查询状态:
  • availablePermits():返回当前可用的许可数量。
  • getQueueLength():返回等待获取许可的线程数量。
  • hasQueuedThreads():返回是否有线程正在等待获取许可。
  • drainPermits():获取并消耗所有可用的许可。

六、ConcurrentHashMap

ConcurrentHashMap是Java中一个线程安全的HashMap实现,它被设计用于在多线程环境中高效地存储键值对。
在ConcurrentHashMap中,key和value都不允许为null

主要方法:

  • put(key, value):插入或更新键值对。
  • get(key):获取键对应的值。
  • remove(key):删除指定键的映射。
  • containsKey(key):检查是否存在指定的键。
  • forEach(BiConsumer):遍历所有键值对。
  • computeIfAbsent(key, mappingFunction):如果键不存在,则计算并放入新值。

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

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

相关文章

25届科大讯飞飞星计划 AI研究算法工程师 面经

目录 一面/技术面 2024/08/15 📋 总结: 本来应该是在7月底面试的,但因为有事就拖到了现在,或许是飞星计划里最晚面试的一批?面试官很和蔼,问的问题不算难,总体体验还算不错。 一面/技术面 2024/…

MySQL基础--逻辑存储结构,架构

逻辑存储结构 表空间(ibd 文件):一个 mysql 实例可以对应多个表空间,用于存储记录,索引等数据。 段:分为数据段,索引段,回滚段,InnoDB 是索引组织表,数据段就…

Unity引擎基础知识

目录 Unity基础知识概要 1. 创建工程 2. 工程目录介绍 3. Unity界面和五大面板 4. 游戏物体创建与操作 5. 场景和层管理 6. 组件系统 7. 脚本语言C# 8. 物理引擎和UI系统 学习资源推荐 Unity引擎中如何优化大型游戏项目的性能? Unity C#脚本语言的高级编…

修复 iPad 卡在准备更新或正在进行更新的问题

为什么iPad 更新卡住了?原因很难确定,因为 iPad 的许多故障和状况都可能导致 iPad 无法更新 iOS 和应用程序。此外,很难弄清楚这种情况持续了多长时间。但是,您不必太担心,因为这只是一个小案例,您可以阅读…

Java入门(上)

day01 - Java基础语法 1. 人机交互 1.1 什么是cmd? 就是在windows操作系统中,利用命令行的方式去操作计算机。 我们可以利用cmd命令去操作计算机,比如:打开文件,打开文件夹,创建文件夹等。 1.2 如何打…

单元训练13:串行接口的进阶应用

蓝桥杯,小蜜蜂,单元训练13:串行接口的进阶应用 /** Description:* Author: fdzhang* Email: zfdcqq.com* Date: 2024-08-17 15:41:34* LastEditTime: 2024-08-17 19:48:35* LastEditors: fdzhang*/ #include "stc15f2k60s2.h"#defi…

算法工程师第四十天(647. 回文子串 516.最长回文子序列 动态规划总结篇 )

参考文献 代码随想录 一、回文子串 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 示例 1: 输入:s "abc"…

MySQL 异步主从复制流程解析

前言: 首先MySQL主从复制方式有多种,包括 binlog、GTID等,这里基于 binlog 的形式,解析异步主从复制流程 首先通过下面命令查看全部 binlog 日志文件 show binary logs; binlog 日志文件如下: 然后查看其中一个文件…

ECMAScript6语法:默认参数和rest参数

1、默认参数 默认参数即在定义函数的参数列表中指定了默认值的参数。在 ES5 中,并没有提供在参数列表中指定参数默认值的语法,要想为函数的参数指定默认值,只能在函数体中实现,示例代码如下: function table(width, …

MBR10200FCT-ASEMI智能AI专用MBR10200FCT

编辑:ll MBR10200FCT-ASEMI智能AI专用MBR10200FCT 型号:MBR10200FCT 品牌:ASEMI 封装:TO-220F 批号:最新 最大平均正向电流(IF):10A 最大循环峰值反向电压(VRRM&a…

西安旅游系统--论文pf

TOC springboot383西安旅游系统--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域的鸿…

YOLOv8侦测任务更换主干网络成MobileNetV3

目录 1. 添加主干网络模块 ​编辑1.1 在init.py中添加模块名 1.2 主体代码中添加调用语句块 2. 配置yaml文件 3. 修改成功 1. 添加主干网络模块 1.1 在init.py中添加模块名 1.2 主体代码中添加调用语句块 2. 配置yaml文件 3. 修改成功 自己随便找一个程序跑一跑验证…

微电网控制器是什么?微电网中央控制器|微电网协调控制器|微电网控制系统图|Micon2505微网中央控制器方案介绍

微电网控制器是什么?微电网中央控制器|微电网协调控制器|微电网控制系统图|Micon2505微网中央控制器方案介绍及其在油田采油机场景中的应用。微电网控制器广泛应用于具备光伏,储能,V2G,充电桩,风电,柴油发电…

图解内存分配算法 -- 小内存分配算法

图解内存分配算法 – 小内存分配算法 文章目录 图解内存分配算法 -- 小内存分配算法1. 算法介绍2. 算法图解2.1 约定2.2 数据结构介绍2.3 初始化2.4 第一次 malloc 40字节2.5 第二次 malloc 18 字节2.6 第三次 malloc 20字节2.7 第四次 malloc 40字节2.8 第一次 free2.9 第二次…

LINUX服务器部署准备

文章目录 配置环境变量NODE下载解压安装 NGINX下载NGINX下载GCC并安装解压安装启动NGINX MAVEN下载解压安装配置环境 TOMCAT下载兼容版本解压安装开启远程访问 REDIS下载解压安装配置远程使用关闭保护模式 配置环境变量 vi /etc/profile source /etc/profile解压成功之后、运行…

安装IDEA2021.2.1(含安装包)及其扩展设置

一、下载 通过百度网盘分享的文件:ideaIU-2021.2.1.exe 链接:https://pan.baidu.com/s/1cCUHNm0dpWlfkxf5RCEgfw 提取码:v62e 二、安装 安装视频网址:Java基础概念-12-idea的概述和下载安装_哔哩哔哩_bilibili 三、idea中的第一…

Postman内置动态参数和自定义动态参数

业务场景 现在有两个接口,接口1:获取接口统一鉴权码token接口,接口2:创建标签接口,标签接口的创建依赖接口1返回的鉴权码,即需要获取access_token的值,替换ACCESS_TOKEN。且接口2中标签名不能和…

【计算机硬件内存】

内存插槽中间通常有个突起物将整个插槽稍微切分成为两个不等长的距离, 这样的设计可以让使用 者在安装内存时,不至于前后脚位安插错误,是一种防呆的设计喔。 前面提到CPU所使用的数据都是来自于内存(main memory)&…

Java流程控制04:while循环结构

教学视频链接:https://www.bilibili.com/video/BV12J41137hu?p38&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p38&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 在Java中,while 结构是一个…

【C语言】深入讲解指针(中)

文章目录 前言函数指针函数指针变量的创建函数指针变量的使用两段有趣的代码typedef 关键字 函数指针数组函数指针的使用最后 前言 上一章深入讲解指针(上)我们对字符指针、数组指针、指针和数组传参进行了讲解,本章将对函数指针进行讲解&am…