原子

CAS原子性操作

六眼飞鱼酱① 提交于 2019-12-02 03:26:52
重要网址 https://blog.csdn.net/wufaliang003/article/details/78797203 ABA问题详细介绍 一、什么是CAS操作 cas全称是compare and swap 比较交换 传入三个参数,旧的值、期待的值、想替换的值。会获得变量的之前的值,与期待的值相比,如果相同替换值给变量,如果不同返回false。 cas是unsafe类下的native方法,使用c++进行实现,主要是直接操作cpu指令进行原子性操作。 cas使用于低并发的场景。 二、CAS和synchronized适用场景 1、对于资源竞争较少的情况,使用synchronized同步锁进行线程阻塞和唤醒切换以及用户态内核态间的切换操作额外浪费消耗cpu资源; 而CAS基于硬件实现,不需要进入内核,不需要切换线程,操作自旋几率较少,因此可以获得更高的性能。 2、对于资源竞争严重的情况,CAS自旋的概率会比较大,从而浪费更多的CPU资源,效率低于synchronized。 使用CAS在线程冲突严重时,会大幅降低程序性能;CAS只适合于线程冲突较少的情况使用。而synchronized在jdk1.6之后,已经改进优化。synchronized的底层实现主要依靠Lock-Free的队列,基本思路是自旋后阻塞,竞争切换后继续竞争锁,稍微牺牲了公平性,但获得了高吞吐量

数据库的三范式是什么?

╄→гoц情女王★ 提交于 2019-12-01 23:10:46
第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。 第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。 第三范式:任何非主属性不依赖于其它非主属性。 来源: https://www.cnblogs.com/preferlin/p/11720517.html

五、原子操作(CAS)

删除回忆录丶 提交于 2019-12-01 13:21:06
原子操作(CAS) 一、CAS(Compare And Set) ​ Compare And Set(或Compare And Swap),CAS是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数—— 内存位置 (V)、 预期原值 (A)、 新值 (B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在CAS指令之前返回该位置的值。CAS有效地说明了“我认为位置V应该包含值A;如果包含该值,则将B放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。 ​ 在java中可以通过锁和循环CAS的方式来实现原子操作。Java中 java.util.concurrent.atomic包相关类就是 CAS的实现,atomic包里包括以下类: AtomicBoolean 可以用原子方式更新的 boolean 值。 AtomicInteger 可以用原子方式更新的 int 值。 AtomicIntegerArray 可以用原子方式更新其元素的 int 数组。 AtomicIntegerFieldUpdater 基于反射的实用工具,可以对指定类的指定 volatile int 字段进行原子更新。 AtomicLong 可以用原子方式更新的 long 值。 AtomicLongArray

并发编程之原子操作Atomic&Unsafe

谁说胖子不能爱 提交于 2019-12-01 11:48:36
原子操作:不能被分割(中断)的一个或一系列操作叫原子操作。 原子操作Atomic主要有12个类,4种类型的原子更新方式,原子更新基本类型,原子更新数组,原子更新字段,原子更新引用。Atomic包中的类基本都是使用Unsafe实现的包装类。 基本类型:AtomicInteger,AtomicLong,AtomicBoolean; 引用类型:AtomicReference、AtomicReference的ABA实例、AtomicStampedRerence、AtomicMarkableReference; 数组类型:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray; 属性原子修改器(Updater):AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater; 1、原子更新基本类型类 用于通过原子的方式更新基本类型,Atomic包提供了以下三个类: AtomicBoolean:原子更新布尔类型。 AtomicInteger:原子更新整型。 AtomicLong:原子更新长整型。 AtomicInteger的常用方法如下: int addAndGet(int delta) :以原子方式将输入的数值与实例中的值

读书笔记《C++并发编程实战》(7) - 无锁的并发数据结构

 ̄綄美尐妖づ 提交于 2019-12-01 02:11:07
无锁数据结构: 不使用锁就能实现安全并发地存取的数据结构,可避免数据竞争、死锁、或锁引起性能限制等,以实现最大程度的提高并发性。 设计正确的无锁或无等待的数据结构是比较困难的,若确定需要无锁的情况下产生的收益高于代价时才应考虑(这个需要在多各方面考虑)。 无锁数据结构优缺点: 优点: 1. 最大限度的提高并发性,减少了线程等待的时间; 2. 提高健壮性,避免锁机制引入可能导致的数据结构损坏。 缺点: 1. 为了确保持有不变量或者选择可以持有的替代不变量需要加上操作上的顺序问题,需要加上原子操作,以确保正确的顺序对其他线程可见, 使得设计无锁数据结构比使用锁的更为困难。 2. 无锁可能导致性能下降,原子操作可能比非原子操作慢,无锁数据结构可能需要更多的原子操作,此外硬件在存取相同的原子变量的线程间 同步数据。 来源: https://www.cnblogs.com/haomiao/p/11647411.html

正则表达式学习笔记

霸气de小男生 提交于 2019-12-01 01:28:38
正则表达式学习笔记 概念积累 原子是组成正则表达式的基本单位,在分析正则表达式时,应作为一个整体。原子字符是由所有末显式指定为元字符的打印和非打印字符组成。这包括所有的英文字母、数字、标点符号以及其他一些符号。原子也包括以下内容。 元字符是用于构造规则表达式的具有特殊含义的字符。如果要在正则表达式中包含元字符本身,必须在其前加上””进行转义。 未完,待续。。 来源: https://www.cnblogs.com/jjxhp/p/11639448.html

Java-CAS 与原子类

£可爱£侵袭症+ 提交于 2019-11-30 02:17:53
CAS(Compare and Swap),即比较并替换,实现并发算法时常用到的一种技术。 CAS 的思想很简单:三个参数,一个当前内存值 V、旧的预期值 A、即将更新的值 B,当且仅当预期值 A 和内存值 V 相同时,将内存值修改为 B 并返回 true,否则什么都不做,并返回 false。 和 CAS 相关的一个概念是原子操作。原子操作是不可被中断的一个或一系列操作。而 CAS 则是 Java 中保证原子操作的一种方式。 从 Java1.5 开始,JDK 的并发包里就提供了一些类来支持原子操作,都是以 Atomic 开头。 volatile 不能保证类似 i++ 这样操作的原子性,CAS 能够保证。 一、原子类使用 以 AtomicInteger 为例,常用 API: public final int get():获取当前的值 public final int getAndSet(int newValue):获取当前的值,并设置新的值 public final int getAndIncrement():获取当前的值,并自增 public final int getAndDecrement():获取当前的值,并自减 public final int getAndAdd(int delta):获取当前的值,并加上预期的值 相比 Integer 的优势,多线程中让变量自增:

Java多线程之原子操作类

北战南征 提交于 2019-11-30 00:08:55
在并发编程中很容易出现并发安全问题,最简单的例子就是多线程更新变量i=1,多个线程执行i++操作,就有可能获取不到正确的值,而这个问题,最常用的方法是通过Synchronized进行控制来达到线程安全的目的。但是由于synchronized是采用的是悲观锁策略,并不是特别高效的一种解决方案。实际上,在J.U.C下的Atomic包提供了一系列的操作简单,性能高效,并能保证线程安全的类去更新多种类型。Atomic包下的这些类都是采用乐观锁策略CAS来更新数据。 CAS原理与问题 CAS操作(又称为无锁操作)是一种乐观锁策略。它假设所有线程访问共享资源的时候不会出现冲突,因此不会阻塞其他线程的操作。那么,如果出现冲突了怎么办?无锁操作是使用CAS(compare and swap)来鉴别线程是否出现冲突,出现冲突就重试当前操作直到没有冲突为止。 CAS的操作过程 举例说明: Atomic包中的AtomicInteger类,是通过Unsafe类下的native函数compareAndSwapInt自旋来保证原子性, 其中incrementAndGet函数调用的getAndAddInt函数如下所示: public final int getAndAddInt(Object var1, long var2, int var4) { int var5; do { var5 = this