并发系列(六)-----concurrent的简单介绍

article/2025/8/23 16:14:22

一 简介

  concurrent包是jdk1.5引入的重要的包,主要代码由大牛Doug Lea完成。这个包下的一些类如果用好了可以很方便的保证数据在多线程下操作的正确性。就比如说线程共享的i++,如果使用concurrent包下的Atomic系列类可以很方便的解决这个问题。这篇文章简单的介绍Concurrent包,让你对Concurrent的整体有一个大体的了解,以及简单的了解它的实现原理。

二 concurrent的组成

   concurrent包组成由atomic包和lock包以及一些类组成,打开开发工具锁定到concurrent看一看。

 1. BlockingQueue,Callable,ConcurrentHashMap,ExecutorService, Semaphore等  
 2.java.util.concurrent.atomic:提供所有原子操作的类, 如AtomicInteger, AtomicLong等;  
 3. java.util.concurrent.locks:提供锁相关的类, 如Lock, ReentrantLock, ReadWriteLock, Condition等;

下面是网上收集的一张图

三 公平锁与非公平锁  

  公平锁:加锁前检查是否有排队等待的线程,优先排队等待的线程,先来先得

  非公平锁:加锁时不考虑排队等到的问题,直接尝试获取锁,获取不到自动到对尾等待

四 简单的原理说明

由于Java的CAS同时具有volatile读和volatile写的内存语义,因此Java线程之间的通信现在有了下面4种方式。

1.A线程写volatile变量,随后B线程读这个volatile变量。

2.A线程写volatile变量,随后B线程用CAS更新这个volatile变量。

3.A线程用CAS更新一个volatile变量,随后B线程用CAS更新这个volatile变量。

4.A线程用CAS更新一个volatile变量,随后B线程读这个volatile变量。

一定要理解上面这四种线程之间的通信,因为在concurrent包中大量的用到了其中的语句含义,如果不明白其中的语义请看以前的文章。volatile,CAS

concurrent包的源代码实现,会发现一个通用化的实现模式

首先,声明共享变量为volatile。

然后,使用CAS的原子条件更新来实现线程之间的同步。

同时,配合以volatile的读/写和CAS所具有的volatile读和写的内存语义来实现线程之间的通信。

AQS,非阻塞数据结构和原子变量类(java.util.concurrent.atomic包中的类),这些concurrent包中的基础类都是使用这种模式来实现的,而concurrent包中的高层类又是依赖于这些基础类来实现的。从整体来看,concurrent包的实现示意图如所示。

参考文档:并发编程艺术


http://chatgpt.dhexx.cn/article/ivOn9oy4.shtml

相关文章

python并发之concurrent快速入门

导读:我很笨,但是我很快——计算机之所以计算能力如此出众,不在于其有多智能,而是因为它超快的执行速度,而多核心则可以进一步成倍的提高效率。在python中,concurrent库就是用于完成并发的模块之一。 01 初…

Java 并发工具包(concurrent)详解

目录 一、concurrent并发包 二、ReentrantLock(可重入锁) 1、锁状态中断与可重入 2、尝试非阻塞地获取锁 3、等待可中断 4、设置公平锁 三、CountDownLatch(门栓) 四、cyclicBarrier(栅栏) 五、…

JAVA中split函数的用法

JAVA中split函数的用法 只写经常使用的,并不完整。 1.基本用法,将字符串按照指定字符串进行分割,例如: public class Main {public static void main(String[] args) {String ss "abcabcdefg";String[] split ss.sp…

C语言实现split函数

实现类似JAVA编程语言中split函数: (这里以空格为分隔符进行演示) 函数的声明:void split(char *src,const char *separator,char **dest,int *num) {}变量: 1.*src:要进行分割的字符串地址, 2…

mysql实现自定义split函数

1、自定义split函数脚本 CREATE DEFINER root% FUNCTION tjdemo.fun_get_split_string_total(f_string varchar(1000),f_delimiter varchar(5)) RETURNS int(11) LANGUAGE SQL NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT BEGIN declare returnInt int(11…

Oracle实现split函数

创建TYPE CREATE OR REPLACE TYPE TYPE_SPLIT AS TABLE OF VARCHAR2 (4000);创建函数 CREATE OR REPLACE FUNCTION SPLIT(P_STRING VARCHAR2, P_SEP VARCHAR2 : ,)RETURN TYPE_SPLITPIPELINED ISIDX PLS_INTEGER;V_STRING VARCHAR2(4000) : P_STRING; BEGINLOOPIDX : INSTR(…

java split函数的用法_java中split函数用法以及注意事项

java中split函数用法以及注意事项 发布时间:2020-04-23 10:28:23 来源:亿速云 阅读:215 作者:小新 本篇文章和大家了解一下java中split函数用法以及注意事项。有一定的参考价值,有需要的朋友可以参考一下,希…

mysql 创建函数 split_在mysql中实现split函数的几种方法

在mysql中实现split函数的几种方法 关注:98 答案:2 mip版 解决时间 2021-02-07 11:27 提问者夜落花台 2021-02-07 02:11 在mysql中实现split函数的几种方法 最佳答案 二级知识专家蓝莓九栀 2021-02-07 03:28 mysql 5.* 的版本现在没有split 函数,以下是几个自定义的split函数…

Oracle split函数

一、创建split函数 1、创建TYPE CREATE OR REPLACE TYPE TYPE_SPLIT AS TABLE OF VARCHAR2 (4000); / 2、创建split函数 CREATE OR REPLACE FUNCTION SPLIT(P_STRING VARCHAR2, P_SEP VARCHAR2 : ,)RETURN TYPE_SPLITPIPELINED ISIDX PLS_INTEGER;V_STRING VARCHAR2(4000)…

mysql有split函数么_mysql中split函数

在mysql中并没有split函数,需要自己写: 1)获得按指定字符分割的字符串的个数: Sql代码 DELIMITER$$ DROP FUNCTION IFEXISTS`sims`.`func_get_split_string_total`$$ CREATE DEFINER=`root`@`localhost` FUNCTION `func_get_split_string_total`( f_strin 在mysql中并没有sp…

Python之split函数的详解

目录 一、split函数的官方定义 二、split函数的深刻理解 二、split函数的深刻理解 split函数主要应用场景是Python对字符串的处理中(数据分析,数据处理),以及计算机二级考试的常考基础知识点。 一、split函数的官方定义 定义…

Python基础之split()函数

一、split()函数描述 split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num1 个子字符串split() 方法语法: 二、split()用法 语法: str.split(str"", numstring.count(str)) 参数: str…

分割字符串split函数的正确用法(切片)

分割字符串split函数的正确用法(切片) split函数是将字符串分割为列表 函数原型: str.split(sep,maxsplit)参数说明: str:表示要进行分割的字符串sep:用于指定分隔符,可以包含多个字符,默认为None,即所有…

PostgreSQL 视图

详细了解视图、函数(存储过程)、触发器、别名 视图篇 一、视图定义 引言: 假设天气记录和城市为止的组合列表对我们的应用有用,但我 们又不想每次需要使用它时都敲入整个查询。我们可以在该查询上创建一个视图,这会给该 查询一…

SQL Server 数据库之视图(二)

视图(二) 1. 查询视图信息1.1 查询和视图设计工具1.2 关系图视图1.3 条件窗格1.4 SQL 窗格1.5 结果窗格1.6 SQL 编辑器1.7 获取有关视图的信息 2. 创建基于视图的视图3. 删除视图 1. 查询视图信息 1.1 查询和视图设计工具 打开视图的定义、显示查询视图…

hive视图

Hive的视图 应用场景将特定的列提供给用户,保护数据隐私 用于查询语句复杂的场景 通过隐藏子查询、连接和函数来简化查询的逻辑结构只保存定义,不存储数据 如果删除或更改基础表,则查询视图将失败 视图是只读的,不能插入或装载数据…

mysql 查询视图_MySQL查看视图

查看视图 是指查看数据库中,已经存在的视图的定义 查看视图,必须要有SHOW VIEW的权限 查看视图有三种方式 DESCRIBE语句 使用DESCRIBE语句,查看视图 MySQL中,使用DESCRIBE可以查看视图的字段信息,其中,包括…

UML 视图

概述 事物(Things)、关系(Relationships) 是组成 UML 模型的基本模型元素,图由模型元素事物和关系构成,视图由各种图构成。 随着系统复杂性的增加,建模就成了必不可少的工作。理想情况下,系统由单一的图形…

MYSQL基础之 视图

概念 什么是视图? 视图是基于 SQL 语句的结果集的可视化的表。 当然视图也是数据库中对象之一,其它的对象包括:表,数据字典,约束,索引,触发器,存储过程,以及存储函数。这些后面再…

ClickHouse 物化视图

像通常的计算一样,强大的能力意味着至少有一点复杂性。这篇由两部分组成的文章通过准确解释物化视图的工作原理来填补空白,以便即使是初学者也可以有效地使用它们。我们将提供几个详细的示例,您可以根据自己的用途进行调整。在此过程中&#…