1、CAS之前
多线程环境不使用原子类保证线程安全(基本数据类型)
package com.atguigu.juc.cas;/*** @author shizan* @Classname T3* @Description TODO* @Date 2022/5/31 10:35 上午*/public class T3 {volatile int number = 0;// 读取public int getNumber() {return number;}// 写入加锁保证原子性public synchronized void setNumber() {number++;}}
多线程环境使用原子类保证线程安全(基本数据类型)
package com.atguigu.juc.cas;import java.util.concurrent.atomic.AtomicInteger;/*** @author shizan* @Classname T3* @Description TODO* @Date 2022/5/31 10:35 上午*/public class T3 {AtomicInteger atomicInteger = new AtomicInteger();public int getAtomicInteger() {return atomicInteger.get();}public void setAtomicInteger() {atomicInteger.getAndIncrement();}}
2、是什么 2.1、说明
CASand swap的缩写,中文翻译成 比较并交换, 实现并发算法时常用到的一种技术 。它包含三个操作数—— 内存位置、预期原值及更新值 。
执行CAS操作的时候,将内存位置的值与预期原值比较:
如果 相匹配,那么处理器会自动将该位置值更新为新值,
如果 不匹配,处理器不做任何操作,多个线程同时执行CAS操作 只有一个会成功 。
原理:
CAS ()
CAS有3个操作数,位置内存值V,旧的预期值A,要修改的更新值B 。
当且仅当旧的预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做或重来
2.2、硬件级别保证
CAS是JDK提供的 非阻塞原子性操作,它通过 硬件保证 了比较-更新的原子性 。
它是非阻塞的且自身原子性,也就是说这玩意效率更高且通过硬件保证,说明这玩意更可靠 。
CAS是一条CPU的原子指令( 指令),不会造成所谓的数据不一致问题,提供的CAS方法(如)底层实现即为CPU指令 。
执行指令的时候,会判断当前系统是否为多核系统,如果是就给总线加锁,只有一个线程会对总线加锁成功,加锁成功之后会执行cas操作,也就是说CAS的原子性实际上是CPU实现的,其实在这一点上还是有排他锁的,只是比起用,这里的排他时间要短的多,所以在多线程情况下性能会比较好
2.3、代码
package com.atguigu.juc.cas;import java.util.concurrent.atomic.AtomicInteger;/*** @auther zzyy* @create 2021-03-17 15:13*/public class CASDemo{public static void main(String[] args){AtomicInteger atomicInteger = new AtomicInteger(5);System.out.println(atomicInteger.get());System.out.println(atomicInteger.compareAndSet(5, 308)+"\t"+atomicInteger.get());System.out.println(atomicInteger.compareAndSet(5, 3333)+"\t"+atomicInteger.get());}}
2.4、源码分析(int ,int )
上面三个方法都是类似的,主要对 4 个参数做一下说明 。
var1 :表示要操作的对象
var2 :表示要操作对象中属性地址的偏移量
var4 :表示需要修改数据的期望的值
var5/var6 :表示需要修改为的新值
引出来一个问题:类是什么?
3、CAS底层原理?如果知道,谈谈你对的理解 3.1、
1
是 CAS 的核心类,由于 Java 方法无法直接访问底层系统,需要通过本地()方法来访问,相当于一个后门,基于该类可以直接操作特定内存的数据 。类存在于 sun.misc 包中,其内部方法操作可以像 C 的 指针一样直接操作内存,因为 Java 中 CAS 操作的执行依赖于类的方法 。
注意类中的所有方法都是修饰的,也就是说类中的方法都直接调用操作系统底层资源执行相应任务
2 变量,表示该变量值在内存中的 偏移地址 ,因为就是根据内存偏移地址获取数据的 。
3 变量 value 用修饰,保证了多线程之间的内存可见性 。
3.2、我们知道i++线程不安全的,那.()
- 转载 UCenter Home如何做线下活动
- 如何理解「异或」的含义?
- 不挖鼻孔怎么清理鼻屎,不挖鼻孔怎么清理鼻屎
- 不易胖的体质怎么增肥,瘦人如何增肥
- 古人的袖子真的能放东西吗为何放进去不会掉出来
- 古代有地位的女子,她们的袍子拖地不会弄脏了吗
- 闰年的定义 如何计算闰年
- 不找伴娘用什么代替,结婚如果没有伴郎和伴娘,请花童代替行吗
- 不开单怎么转运,运气不佳,如何转运
- 算命:你八年后做宰相九年后会饿死结果如何?