atomic

线程安全

こ雲淡風輕ζ 提交于 2020-08-17 01:00:59
1、什么是线程安全? 就是我们要确保在多条线程访问的时候,我们的程序还能按照我们预期的行为去执行。 2、线程不安全的原因 多个线程同时访问相同的资源,并同时对资源做了写操作。 3、实现线程安全的方法 使用 synchronize关键字 使用 java.util.concurrent.atomic包下的原子类 使用 java.util.locks包中的锁 使用线程安全的集合 concurrentHashMap 使用 volatile关键字,保证变量的可见性 来源: oschina 链接: https://my.oschina.net/u/3887243/blog/4498013

GitHub标星120K+的JDK并发编程指南,连续霸榜GitHub终于开源了

别等时光非礼了梦想. 提交于 2020-08-15 17:38:40
前言 前面整理了一部分多线程源码的文章,看大家 正言 对于线程和 进程,我理解的就是汽车和高速公路 但是对于人脑的认知来说,“代码一行行串行”当然最容易理解。但在多线程下,多个线程的代码交叉并行,要访问互斥资源,要互相通信。作为开发者,需要仔细设计线程之间的互斥与同步,稍不留心,就会写出非线程安全的代码。正因此,多线程编程一直是一个被广泛而深入讨论的领域。 在JDK1.5发布之前,Java只在语言级别上提供一些简单的线程互斥与同步机制,也就是synchronized关键字、wait 与notify。如果遇到复杂的多线程编程场景,就需要开发者基于这些简单的机制解决复杂的线程同步问题。而从JDK 1. 5开始,并发编程大师Doug Lea奉上了一个系统而全面的并发编程框架一一JDKConcurrent包,里面包含了1各种原子操作、线程安全的容器、线程池和异步编程等内容。 本书基于JDK7和JDK8,对整个Concurrent包进行全面的源码剖析。JDK8中大部分并发功能的实现和JDK7一样,但新增了一些额外特性。例如CompletableFuture、ConcurrentHashMap的新实现、StampedLock、LongAdder等。 对整个Concurrent包的源码进行分析,有以下几个目的: (1)帮助使用者合理地选择解决方案。Concurrent包很庞大

[原][c][netCDF]返回值合集(错误列表)

China☆狼群 提交于 2020-08-15 08:42:33
#define NC_NOERR 0 /**< No Error */ #define NC2_ERR (-1) /**< Returned for all errors in the v2 API. */ /* * Not a netcdf id. The specified netCDF ID does not refer to an open netCDF dataset. */ #define NC_EBADID (-33) #define NC_ENFILE (-34) /**< Too many netcdfs open */ #define NC_EEXIST (-35) /**< netcdf file exists && NC_NOCLOBBER */ #define NC_EINVAL (-36) /**< Invalid Argument */ #define NC_EPERM (-37) /**< Write to read only */ /* * Operation not allowed in data mode. This is returned for netCDF classic or 64-bit offset files, or for netCDF-4 files, when they were been created with ::NC

Java并发编程:volatile关键字解析

送分小仙女□ 提交于 2020-08-15 04:50:33
Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。   volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volatile关键字的场景。   以下是本文的目录大纲:   一.内存模型的相关概念   二.并发编程中的三个概念   三.Java内存模型   四..深入剖析volatile关键字   五.使用volatile关键字的场景   若有不正之处请多多谅解,并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接:   http://www.cnblogs.com/dolphin0520/p/3920373.html 一.内存模型的相关概念   大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题

深藏不露得Java关键字 ‘’ Volatile“

筅森魡賤 提交于 2020-08-14 22:35:43
前言 volatile 关键字好像我们一直听人提起,但是工作中实际用到得却并不是很多。最近一直在翻相关得资料,无奈网上讲 volatile 的博客很多,官方的资料却很少,因为我本人还是比较喜欢先看官方的一手解读,即使一开始看不懂,留个印象,以后回过头再去再读也会有不一样的感悟。终于,在Oracle官方谈及原子操作的时候有这样一段话: In programming, an atomic action is one that effectively happens all at once. An atomic action cannot stop in the middle: it either happens completely, or it doesn’t happen at all. No side effects of an atomic action are visible until the action is complete. We have already seen that an increment expression, such as c++ , does not describe an atomic action. Even very simple expressions can define complex actions that can

Java并发编程:volatile关键字解析

纵然是瞬间 提交于 2020-08-14 13:00:28
Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。   volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volatile关键字的场景。   以下是本文的目录大纲:   一.内存模型的相关概念   二.并发编程中的三个概念   三.Java内存模型   四..深入剖析volatile关键字   五.使用volatile关键字的场景   若有不正之处请多多谅解,并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接:   http://www.cnblogs.com/dolphin0520/p/3920373.html 一.内存模型的相关概念   大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题

MySQL-操作语句

故事扮演 提交于 2020-08-14 09:00:00
操作数据库 语句分类 DDL 定义库、表 create 、drop、alter DML 更新数据 insert 、update、delete DQL 查询 select DCL 控制 grant、deny、revoke TCL 事务 commit、rollback DDL示例 创建数据库 : create database [if not exists] 数据库名; 删除数据库 : drop database [if exists] 数据库名; 查看数据库 : show databases; 使用数据库 : use 数据库名; 创建表 create table [if not exists] `表名`( '字段名1' 列类型 [属性][索引][注释], '字段名2' 列类型 [属性][索引][注释], #... '字段名n' 列类型 [属性][索引][注释] )[表类型][表字符集][注释]; 说明 : 反引号用于区别MySQL保留字与普通字符而引入的 (键盘esc下面的键) DML示例 通过DML语句管理数据库数据 添加数据 INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3',...) 注意 : 字段或值之间用英文逗号隔开 ' 字段1,字段2...' 该部分可省略 , 但添加的值务必与表结构,数据列,顺序相对应

深浅拷贝

ぐ巨炮叔叔 提交于 2020-08-13 18:45:09
"""Generic (shallow and deep) copying operations. Interface summary: import copy x = copy.copy(y) # make a shallow copy of y x = copy.deepcopy(y) # make a deep copy of y 使用案例 第一个是浅拷贝,第二个是深拷贝。 For module specific errors, copy.Error is raised. 本模块使用到的特殊的异常,copy.Error The difference between shallow and deep copying is only relevant for compound objects (objects that contain other objects, like lists or class instances). 深浅拷贝不同在于对容器类型的数据进行拷贝,容器类型有比如lists或者是class。 - A shallow copy constructs a new compound object and then (to the extent possible) inserts *the same objects* into it that the original

数据库中的事务

天涯浪子 提交于 2020-08-13 17:27:59
1 什么是事务? 事务是用户定义的一组操作序列,这些操作要么全部完成,要么都不做 2 事务的四个特性 ACID 原子性(Atomic):整个事务的全部操作,要么全部完成,要么都不做 一致性(Consist):事务前后数据的完整性必须保持一致 隔离性(Isolated):各个事务对数据操作互不干扰 持久性(Durable):一旦事务提交,对数据的改变将是永久性的 3 事务的隔离问题 脏读:一个事务读取了另一个事务未提交的数据 不可重复度:在一个事务中读取表中一行数据,多次读取结果不同 幻读:一个事务中读取到了别的事务插入的数据,导致前后读取不一致 4 事务四个隔离级别 1) 读未提交:事务中的修改,即使没有提交,对其他事务也是可见的。 容易导致 脏读 2) 读已提交:事务所做的修改在最终提交之前,对其他的事务是不可见的。 解决了 脏读 问题,但出现了 不可重复读 问题 3)可重复读( 默认级别 ):同一个事务中多次读取同样的记录 结果是一致的。 解决了 不可重复读 问题 ,但出现了 幻读 问题 4)可序列化: 强制 事务序列化 执行 来源: oschina 链接: https://my.oschina.net/u/3887243/blog/4406717

深入理解Linux内核中的并发与竞争的处理

时光总嘲笑我的痴心妄想 提交于 2020-08-13 11:12:52
工科生一枚,热衷于底层技术开发,有强烈的好奇心,感兴趣内容包括单片机,嵌入式Linux,Uboot等,欢迎学习交流! 爱好跑步,打篮球,睡觉。 欢迎加我QQ1500836631(备注CSDN),一起学习交流问题,分享各种学习资料,电子书籍,学习视频等。 文章目录 内核中的并发和竞争简介 原子操作 原子操作简介 整型原子操作函数 位原子操作函数 原子操作例程 自旋锁 自旋锁简介 自旋锁操作函数 自旋锁例程 读写自旋锁 读写锁例程 顺序锁 顺序锁操作函数 自旋锁使用注意事项 信号量 信号量简介 信号量操作函数 信号量例程 互斥体 互斥体简介 互斥体操作函数 互斥体例程 互斥体与自旋锁 互斥体使用注意事项 内核中的并发和竞争简介   在早期的 Linux内核中,并发的来源相对较少。早期内核不支持对称多处理( symmetric multi processing,SMP),因此,导致并发执行的唯一原因是对硬件中断的服务。这种情况处理起来较为简单,但并不适用于为获得更好的性能而使用更多处理器且强调快速响应事件的系统。   为了响应现代硬件和应用程序的需求, Linux内核已经发展到同时处理更多事情的时代。Linux系统是个多任务操作系统,会存在多个任务同时访问同一片内存区域的情况,这些任务可能会相互覆盖这段内存中的数据,造成内存数据混乱。针对这个问题必须要做处理,严重的话可能会导致系统崩溃