zoukankan      html  css  js  c++  java
  • Java高并发9-CAS操作与Unsafe类详解

    一、复习

    • 计算机内存模型,synchronized和volatile关键字简介

    二、两者对比

    • sychronized和volatile都解决了内存可见性问题
    • 不同点:
    • (1)前者是独占锁,并且存在者上下文切换的开销以及线程重新调度的开销;后者是非阻塞算法,不会造成上下文切换的开销。
    • (2)前者可以保证操作的原子性,但是后者不能保证操作的原子性。

    三、在什么情况下才会使用volatile

    • 写入变量是不依赖当前值的,如果是依赖当前值的话,由于获取-计算-写入,三者不是原子性操作,而volatile是保证原子性操作的。
    • 变量没有加锁的时候,如果变量加锁了,是可以保证内存的可见性的因此不需要再使用volatile

    四、Java中的原子性操作

    • 原子性操作通俗的来讲就是一组操作,要么都执行成功,要么都执行失败,不存在执行部分成功的情况
    • 使用synchronized关键字既可以保证操作的原子性又可以保证内存的可见性,volatile只能保证内存的可见性,但是不能保证操作的原子性;synchronized固然好,但在高并发的情况下,由于它是一种独占锁,因此会引起性能低下的问题。

    五、Java中的CAS操作

    • 定义:CAS(compare and swap)比较并交换,这是JDK提供的一种非阻塞算法,它通过硬件保证了比较-更新的原子性问题。JDK中的Unsafe类提供了一系列的compareAndSwap*方法,下面以compareAndSwapLong为例进行讲解
    • boolean compare(Object obj,long offset,long expect,long update)
    • 先分别解释一下各个参数,obj是一个对象的引用(也就是对象存储的地址),offset是相对于前面地址的偏移量,expect是一个预想的值,update代表如果和预想的值一样,那么就是使用update这个值来代替,并且返回true,否则返回false
    • 这是处理器提供的一种原子性指令

    六、ABA问题

    • 描述:线程1获取变量x的值为A,然后尝试修改为B,但是此时如果有另一个线程修改了x的值为B,同时又修改成了A,那么线程2的这个A和线程1之前的A就不是同一个A了
    • 产生原因:环形依赖,变量的值从A到B,然后又从B到A,这样只能一个方向轮转,如果是从A到B,然后从B到C就不会出现这种情况。
    • 解决方式:JDK中的AtomicStampedReferece给每个变量一个时间戳,从而避免了ABA问题

    七、Unsafe类

    • 在JDK中的rt.jar包中有许多方法都是native的,这是一种硬件级别的操作,使用JNI来调用C++底层函数来操作。

    1.long objectFieldOffset(Field field)

    • 释义:获取某个对象的中的某个域值所在对象的中的内存偏移量
    try{
     long value = Unsafe.objectFieldOffset(AutomicLong.class.getDeclaredField("value"));
    }catch(Exception e){
     e.printStackTrace();
    }

    2.int arrayBaseOffset(Class arrayClass)

    • 释义:获取数组中的第一个元素地址

    3.int arrayIndexOffset(Class arrayClass)

    • 释义:获取数组中第一个元素的字节大小

    4.boolean compareAndSwapLong(Object obj,long offset,long expect,long update)

    • 可以见上文

    八、源码:

  • 相关阅读:
    iOS 循环引用 委托 (实例说明)
    【iOS】自动引用计数 (循环引用)
    有关UITableviewCell 重用内存 内部解析
    通用的类->可直接存储的Dictionary,可以被JSON或NSUserDefaults
    ipa 发布到stroe
    根据当前登录域账号 获取AD用户姓名和所在OU目录
    ASP.NET MVC 操作AD 获取域服务器当前用户姓名和OU信息
    各种图标 资源下载
    【赚】cocos2d-x学习资源汇总(持续更新。。。)
    ios网络层优化深入浅出
  • 原文地址:https://www.cnblogs.com/ruigege0000/p/14028056.html
Copyright © 2011-2022 走看看