美文网首页
CAS+ABA+Unsafe+悲观锁和乐观锁

CAS+ABA+Unsafe+悲观锁和乐观锁

作者: 永远的太阳0123 | 来源:发表于2018-11-11 10:28 被阅读0次
1 CAS

CAS,即compare and swap。
CAS操作是原子操作,在多线程中执行CAS操作可以实现同步。
CAS操作中包含三个操作数,分别是内存地址、预期原值和新值。首先比较这个内存地址存放的数值和预期原值,如果二者相等,将这个内存地址存放的数值设为新值,CAS操作成功;如果二者不相等,CAS操作失败。CAS操作的原子性可以确保这个内存地址存放的数值是根据预期原值计算得到的。
CAS操作中的问题:ABA问题,循环时间长开销大,只能保证一个共享变量的原子操作。

2 CAS操作中的ABA问题

线程1读取这个内存地址存放的数值A。然后线程2先将这个内存地址存放的数值设为B,再将这个内存地址存放的数值设为A。此时,线程1依然可以执行CAS操作。但是在这个过程中并非没有问题,例如一个栈的栈顶元素发生变化后重新恢复,不代表这个栈的内部没有发生变化。



(1)线程1读取栈顶指针,此时栈顶指针指向元素A,A的next等于元素B。线程1准备执行CAS操作。
(2)线程2执行CAS操作,将栈顶指针指向元素B,将A的next设为null。此时元素A处于游离状态。
(3)线程2执行CAS操作,将栈顶指针指向元素C,将B的next设为null。此时元素A和元素B都处于游离状态。
(4)线程2执行CAS操作,将栈顶指针指向元素A,将A的next设为元素C。此时元素B处于游离状态。
(5)线程1执行CAS操作,将栈顶指针指向元素B,将A的next设为null。此时代表栈顶元素的元素B处于游离状态。

3 获取Unsafe实例

通过反射可以获取Unsafe实例。
OpenJDK8 Unsafe源码:http://hg.openjdk.java.net/jdk8u/hs-dev/jdk/file/a006fa0a9e8f/src/share/classes/sun/misc/Unsafe.java

import java.lang.reflect.Field;
import sun.misc.Unsafe;

public class UnsafeDemo {

    public static void main(String[] args) {
        Unsafe unsafe = UnsafeDemo.getUnsafe();
        System.out.println(unsafe);
    }

    public static Unsafe getUnsafe() {
        try {
            Field field = Unsafe.class.getDeclaredField("theUnsafe");
            field.setAccessible(true);
            return (Unsafe) field.get(null);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}
4 悲观锁和乐观锁

(1)悲观锁:各个用户访问数据库读取数据和更新数据时,必须先获取锁,使数据处于锁定状态,以防止其它用户更新数据。
(2)乐观锁:多个用户可以并发访问数据库,读取数据副本。用户更新数据时,比较数据库中的当前数据和数据副本,以判断其他用户是否已经更新该数据。如果二者不相等,忽略本次更新请求并提示用户更新失败。

相关文章

  • 看完你就知道的乐观锁和悲观锁

    看完你就知道的乐观锁和悲观锁 Java 锁之乐观锁和悲观锁 [TOC] Java 按照锁的实现分为乐观锁和悲观锁,...

  • 乐观锁和悲观锁

    参考来源 深入理解乐观锁与悲观锁 乐观锁的一种实现方式——CAS mysql乐观锁总结和实践 乐观锁和悲观锁 悲观...

  • 锁的概述

    乐观锁与悲观锁 悲观锁 乐观锁和悲观锁的概念出自数据库,但在java并发包中也引入和类似的概念(乐观锁/悲观锁是一...

  • 并发参数

    悲观锁与乐观锁 悲观锁 synchronized和ReentrantLock等独占锁就是悲观锁思想的实现乐观锁一般...

  • CAS 与原子操作

    乐观锁与悲观锁 锁可以从不同的角度分类。其中,乐观锁和悲观锁是一种分类方式。 乐观锁:乐观锁又称为“无锁”。乐观锁...

  • 04 番外(待补充AQS相关原理) Java多线程中的各种锁

    1 乐观锁 悲观锁 1.1 乐观锁 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设...

  • Mysql锁

    按照使用方式,锁分为: 悲观锁 乐观锁 乐观锁 概念就不细讲了,乐观锁和悲观锁的区别是乐观锁是假设在修改数据之前,...

  • CAS+ABA+Unsafe+悲观锁和乐观锁

    1 CAS CAS,即compare and swap。CAS操作是原子操作,在多线程中执行CAS操作可以实现同步...

  • MySQL之乐观锁·MVCC

    一、 乐观锁 和 悲观锁 乐观锁 和 悲观锁 是实现并发操作的两种不同的 加锁思想,其中: 乐观锁 假设:操作能成...

  • 蚂蚁面试

    1、mysql乐观锁和悲观锁的区别? 乐观锁通过MVCC,版本实现,悲观锁select... for update...

网友评论

      本文标题:CAS+ABA+Unsafe+悲观锁和乐观锁

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