美文网首页
原子操作

原子操作

作者: ythmilk | 来源:发表于2021-02-15 20:36 被阅读0次

无锁

通过CAS+volatile来实现

while (true) {
int prev = balance.get();
int next = prev - amount;
if (balance.compareAndSet(prev, next)) {
break;
 }
 }
// 可以简化为下面的方法
// balance.addAndGet(-1 * amount);

CAS特点

  1. 基于乐观锁设计,不怕修改共享变量,修改了也没事,继续等待就可以。
  2. synchronized是基于悲观锁,锁住操作,会导致线程状态切换,也会用户态到内核态切换。效率较差。
  3. CAS需要重试,CPU空转,如果是单核cpu或者线程数量大于cpu核心数,也会导致线程状态一直切换,效率反而变低。

CAS+volatile

cas+volatitle组合实现乐观锁,volatile只能保证可见性,和一部分的有序性,并不能防止指令重排序。通过cas+volatitle的组合实现乐观锁。

JUC中的原子类

原子整数

基本的i++,i--,等操作,还可以是表达式,表达式可以保证是原子操作。
AtomicBoolean
AtomicInteger
AtomicLong

原子引用

通过无锁的方式更新变量对象的引用值。
AtomicReference//不能解决ABA问题
AtomicStampedReference//增加版本号,可以追踪每次修改
AtomicMarkableReference//增加标识,可以看到是否修改,但不追踪整个过程

原子数组

AtomicIntegerArray
AtomicLongArray
AtomicReferenceArray

字段更新器

线程安全的方式更新对象中的某个字段
需要配合volatitle使用:字段必须是volatile修饰的,否则抛出异常
AtomicReferenceFieldUpdater
AtomicIntegerFieldUpdater
AtomicLongFieldUpdater

原子累加器

性能更好

Unsafe

Unsafe 对象提供了非常底层的,操作内存、线程的方法,Unsafe 对象不能直接调用,只能通过反射获得

Unsafe实现CAS

class Student {
volatile int id;
volatile String name; }
Unsafe unsafe = UnsafeAccessor.getUnsafe();
Field id = Student.class.getDeclaredField("id");
Field name = Student.class.getDeclaredField("name");
// 获得成员变量的偏移量
long idOffset = UnsafeAccessor.unsafe.objectFieldOffset(id);
long nameOffset = UnsafeAccessor.unsafe.objectFieldOffset(name);
Student student = new Student();
// 使用 cas 方法替换成员变量的值
UnsafeAccessor.unsafe.compareAndSwapInt(student, idOffset, 0, 20); // 返回 true
UnsafeAccessor.unsafe.compareAndSwapObject(student, nameOffset, null, "张三"); // 返回 true
System.out.println(student);

相关文章

  • 第10章 内核同步方法

    一、原子操作 原子操作可以操作指令以原子的方式执行,执行过程不会被打断。 1.1 原子整数操作 针对整数的原子操作...

  • Java自学-多线程 原子访问

    多线程 原子访问 步骤 1 : 原子性操作概念 所谓的原子性操作即不可中断的操作,比如赋值操作 原子性操作本身是线...

  • Go语言 原子操作

    原子操作就是不可中断的操作,外界是看不到原子操作的中间状态,要么看到原子操作已经完成,要么看到原子操作已经结束。在...

  • 高并发(12)-原子操作类的使用

    @TOC 前言 上篇文章讲解了什么是原子操作,并且怎么实现原子操作。今天就讲一下原子的操作类 什么是原子操作类 为...

  • 11--多线程探索--锁分析

    一、线程相关概念 1.1 原子操作 原子和原子操作 原子操作:不可分割的操作。该操作一定是在同一个CPU时间片中完...

  • 定义属性时,常用的关键字及其作用详解

    atomic: 原子操作(原子性是指事务的一个完整操作,操作成功就提交,反之就回滚. 原子操作就是指具有原子性的操...

  • C++原子性操作,volatile关键字

    原子性操作 原子性操作比加锁访问临界资源更加高效。现代CPU支持一些原子性操作 使用原子性操作实现无锁队列。。。参...

  • Java并发机制底层实现原理-原子操作的实现原理

    章节目录 原子操作含义 相关术语 保证多处理器操作原子性的两种方式 Java语言层面上实现原子操作 原子操作的含义...

  • 从CAS讲起,真正高性能解决并发编程的原子操作

    今天呢!灯塔君跟大家讲: 高性能解决并发编程的原子操作 一.原子性操作 原子性操作:原子性在一个操作是不可中断的,...

  • Java原子类

    1、原子类的分类 原子操作是指一个不可中断的操作。 原子类是指具有原子操作特征的类。 JUC并发包中的原子类都存放...

网友评论

      本文标题:原子操作

      本文链接:https://www.haomeiwen.com/subject/dynpxltx.html