首页 > 编程语言 >并发编程 - Atomic & Unsafe

并发编程 - Atomic & Unsafe

时间:2022-11-07 18:01:48浏览次数:42  
标签:cas 编程 Unsafe 偏移量 AtomicInteger Atomic 内存

1. 全面地走一遍Atomic包下面的原子类;

2. CAS -> 原子比较与交换算法的bug-ABA 问题;

3. 魔法类 - Unsafe,ini -> 堆外内存

Atomic

1. atomic底层实现是基于无锁算法 - cas;

基于魔术类Unsafe提供的三大cas-api完成;

CompareAndSwapObject
CompareAndSwapInt
CompareAndSwapLong
基于硬件原语-CMPXCHG实现原子操作cas

 

// AtomicInteger分析

do {
    oldValue = this.getIntVolatile(AtomicInteger, valueOffset);    // 读AtomicInteger的value值
    // valueOffset---value属性在对象内存当中的偏移量
}while(!this.compareAndSwapInt(AtomicInteger, valueOffset, oldValue, oldValue + 1));

什么叫偏移量?

要用cas修改某个对象属性的值 -》 首先要知道属性在对象内存空间的哪个位置,要知道属性的偏移量。

如果要修改的是一个数组类型,该怎么办呢?,Atomic也给我们提供了如下方式处理方案:

 

 如果不是整形值,而是对象类型数据,Atomic也提供了解决方案。

 

 如果觉得自定义实现UnSafe去获取偏移量,修改值的方法太麻烦,Atomic也提供了如下方式:

 

 还可以基于上述说的基于最原始的Unsafe获取偏移量,基于cas去修改值:

 

Unsafe类的对象获取方式如下:

如果说要改的是一个成员属性是一个对象,而不是Integer数字类型,Atomic也提供了方案如下:

 

 CAS修改的ABA问题

 

 

 

 ABA ->怎么解决?

AtomicStampedReference

参考:https://baijiahao.baidu.com/s?id=1648077822185803003&wfr=spider&for=pc

 

Unsafe 

jdk1.7之后添加的api

内存管理:

举个例子:文件上传,并发量也比较高;可以用Unsafe申请堆外内存。

堆外内存不属于GC管理,用完之后一定要手动释放。否则内存泄露。

 

 Unsafe还提供了跨方法加锁机制。

 

标签:cas,编程,Unsafe,偏移量,AtomicInteger,Atomic,内存
From: https://www.cnblogs.com/zhf123/p/16866865.html

相关文章

  • 编程语言分类
    编程语言分类及区别一、按历代分类编程语言分为三大类:机器语言、汇编语言、高级语言第一代语言(1GL):机器语言特征:面向机器的指令,机器可以直接执行。第二代语言(2GL):汇编......
  • 编程语言分类
    概念描述静态全部或者几乎全部的类型检查是在编译期进行的动态类型的检查是在运行期进行的强类型类型一旦声明就不能改变弱类型变量在运行期时可以改变......
  • 4.深度学习(1) --神经网络编程入门
    前言目前深度学习、AI研究很火爆,它们依赖的最底层就是简单的神经网络,本文将介绍神经网络基础,了解基本的神经网络原理,同时给出样例参考,该样例可以推广到其他的分类、回归问题......
  • JUC并发编程第二章之Java线程
    JUC并发专题系列JUC并发编程第一章之进程与线程JUC并发编程第二章之Java线程JUC并发编程第三章之共享模型之管程JUC并发编程第四章之共享模型之内存JUC并发编程第五章......
  • 实验3 函数应用编程
    实验任务1#include<stdio.h>#include<stdlib.h>#include<time.h>#include<windows.h>#defineN80voidprint_text(intline,intcol,chartext[]);voidpri......
  • 什么是 Python?Python 基础编程入门指南
    Python是当今最流行的编程语言之一。Python以其简单的语法和多功能性而闻名,既易于学习又可用于高级应用程序。可以使用Python的领域也非常广泛,人工智能、机器学习、Web开......
  • 【C++高级编程】(一)C++速成
    本章内容:简要回顾C++语言最重要的部分及语法(主要讲述日常编程会遇到的最重要的C++部分,大佬快速浏览即可) 1.1C++基础知识C++是基于C语言的超集,但这两种语言并不一......
  • 012 Rust 异步编程,在 async 块中使用?
    在Rust异步编程中能否像在同步编程中一样使用问号呢?我们来试试。示例源码[dependencies]futures="0.3"配置文件usefutures;asyncfnfoo()->Result<(),String>{"f......
  • 013 Rust 异步编程,Send trait 相关
    asyncfnFuture是否为Send的取决于是否在.await点上保留非Send类型。编译器尽其所能地估计值在.await点上的保存时间。示例源码usestd::rc::Rc;#[derive(Default)]struct......
  • 011 Rust 异步编程,返回错误
    在Rust异步块中,当发生返回错误的时,会是怎么样的呢?本节就这个知识点进行讲解。示例源码usefutures;asyncfnfoo(){"foo"}fnmain(){futures::executor::block_on......