java cas是原子性的么_Java 并发编程:AQS 的原子性如何保证
当我们研究AQS框架时(对于AQS不太熟知可以先阅读《什么是JDK内置并发框架AQS》,会发现AbstractQueuedSynchronizer这个类很多地方都使用了CAS操作。在并发实现中CAS操作必须具备原子性,而且是硬件级别的原子性。我们知道Java被隔离在硬件之上,硬件级别的操作明显力不从心。这时为了能够执行操作系统层面的操作,就必须要通过用C++编写的native本地方法来扩展实现。一般可以通过JNI方式实现Java代码调用C++代码
Unsafe调用
JDK提供了一个类来满足CAS的硬件级别原子性要求,即sun.misc.Unsafe类,从名字上大概知道它用于执行低级别、不安全的操作,AQS就是使用此类来完成硬件级别的原子操作。也就是说通过该类就能实现对处理器的原子操作,Unsafe通过JNI调用本地C++代码,C++代码调用了硬件指令集,这些硬件指令集都属于CPU。
Unsafe的魔法
Unsafe是一个很强大的类,它可以分配内存、释放内存、可以定位对象某字段的位置、可以修改对象的字段值、可以使线程挂起、使线程恢复、可进行硬件级别原子的CAS操作等等。
image.png
Unsafe的用途
因为存在安全性问题,所以如果我们要用Unsafe类则需要另辟蹊径。可行的方法就是通过反射来绕过上述的安全检查,我们可以通过以下的getUnsafeInstance方法来获取Unsafe实例。这段代码演示了如何获取Java对象的相对地址偏移量以及使用Unsafe来完成CAS操作,最终输出的是flag字段的内存偏移量及CAS操作后的值。最终的输出为“unsafeTest对象的flag字段的地址偏移量为:12”和“CAS操作后的flag值为:101”。另外如果使用开发工具如Eclipse,可能会编译通不过,只要把编译错误提示关掉即可。
Unsafe实现CAS
因为存在安全性问题,所以如果我们要用Unsafe类则需要另辟蹊径。可行的方法就是通过反射来绕过上述的安全检查,我们可以通过以下的getUnsafeInstance方法来获取Unsafe实例。这段代码演示了如何获取Java对象的相对地址偏移量以及使用Unsafe来完成CAS操作,最终输出的是flag字段的内存偏移量及CAS操作后的值。最终的输出为“unsafeTest对象的flag字段的地址偏移量为:12”和“CAS操作后的flag值为:101”。另外如果使用开发工具如Eclipse,可能会编译通不过,只要把编译错误提示关掉即可。
总结
这里主要讲解了Unsafe类如何让Java层能实现硬件级别的原子操作,同时也了解了Unsafe类拥有很多法魔技能。通常我们使用Java时不需要在内存中处理Java对象及内存地址位置,但有的时候我们被迫必须要操作Java对象相关的地址,于是我们只能使用Unsafe类。使用该类则意味着破坏了Java平台隔离的效果了,我们都知道一旦用了本地方法则可能会引来跨平台问题。
Java 并发编程
java cas是原子性的么_Java 并发编程:AQS 的原子性如何保证相关推荐
- java volatile 原子性_Java并发编程之验证volatile不能保证原子性
Java并发编程之验证volatile不能保证原子性 通过系列文章的学习,凯哥已经介绍了volatile的三大特性.1:保证可见性 2:不保证原子性 3:保证顺序.那么怎么来验证可见性呢?本文凯哥(凯 ...
- java公平索非公平锁_Java 并发编程中使用 ReentrantLock 替代 synchronized
Java 5 引入的 Concurrent 并发库软件包中,提供了 ReentrantLock 可重入同步锁,用来替代 synchronized 关键字原语,并可提供更好的性能,以及更强大的功能.使用 ...
- java对象不会被改变_Java 并发编程(二)对象的不变性和安全的公布对象
二.安全公布 到眼下为止,我们重点讨论的是怎样确保对象不被公布,比如让对象封闭在线程或还有一个对象的内部.当然,在某些情况下我们希望在多个线程间共享对象,此时必须确保安全地进行共享.然而,假设仅仅是像 ...
- java list 占用内存不释放_Java并发编程 - CopyOnWrite容器类
前言 当我们对List进行遍历的时候,如果list被修改了会抛出java.util.ConcurrentModificationException错误.那么有没有办法在遍历一个list的时候,还向li ...
- java限制一个接口的执行时间_Java 并发编程:任务执行器 Executor 接口
任务执行器(Executor)是一个接口,位于java.util.concurrent包下,它的作用主要是为我们提供任务与执行机制(包括线程使用和调度细节)之间的解耦.比如我们定义了一个任务,我们是通 ...
- java赋值语句_java并发编程之原子性问题
程序是否线程安全,取决于哪些要素呢,主要是以下三个: 原子性, 可见性, 有序性. 今天先一起来学习原子性. 原子性: 我理解一个操作不可再分,即为原子性.而在并发编程的环境中,原子性的含义就是只要该 ...
- java 如何知道对象是否被修改过_Java 并发编程:AQS 的原子性如何保证
当我们研究AQS框架时(对于AQS不太熟知可以先阅读<什么是JDK内置并发框架AQS>,会发现AbstractQueuedSynchronizer这个类很多地方都使用了CAS操作.在并发实 ...
- 重点知识学习(8.2)--[JMM(Java内存模型),并发编程的可见性\原子性\有序性,volatile 关键字,保持原子性,CAS思想]
文章目录 1.JMM(Java Memory Model) 2.并发编程的可见性 3.并发编程的有序性 4.并发编程的原子性 5.volatile 关键字 6.保持原子性: 加锁,JUC原子类 加锁 ...
- java cas机制_java并发编程中的CAS机制,你理解嘛?
学习Java并发编程,CAS机制都是一个不得不掌握的知识点.这篇文章主要是从出现的原因再到原理进行一个解析.希望对你有所帮助. 一.为什么需要CAS机制? 为什么需要CAS机制呢?我们先从一个错误现象 ...
最新文章
- C# 获取指定目录下所有文件信息、移动目录、拷贝目录
- 混合SSVEP-P300 BCI生产双频SSVEP
- linux怎么同时查看两个文件,MultiTail - 在单个Linux终端中同时监视多个文件
- bdd cucumber_如何使用BDD构建坚如磐石的Ruby on Rails应用
- Android 系统(220)---如何快速对系统重启问题进行归类
- python怎么实现黑客攻击英国_注意!你的隐私就是这样被黑客获取的
- 面试官问我:什么是JavaScript闭包,我该如何回答?
- Pytorch使用记录
- android 控件随手指移动_Android 实习生面试经历记录
- 制造业ERP项目设计摘录
- 轻松获取windows10锁屏壁纸
- W806做电机转速调控
- 多标签用户画像分析跑得快的关键在哪里?
- Sansen精粹阅读笔记(1)OTA和OCA (电流放大器)
- Warshall沃舍尔算法
- Anaconda安装之后Spyder闪退解决办法
- 设计模式“6”大原则!
- SQL 查询当前时间
- Windows XP 源代码在线泄露
- golang中的图像image处理详解
热门文章
- 直播 | 清华大学李一鸣:后门攻击简介
- 首个金融领域的开源中文预训练语言模型FinBERT了解下
- 指哪分哪:交互式分割近期发展
- ACL 2019开源论文 | 基于Attention的知识图谱关系预测
- 在TensorFlow和PaddleFluid中使用多块GPU卡进行训练
- CentOS 7 从下载到安装
- class path resource [log4j.properties] cannot be resolved to URL because it does not exist
- 2019牛客暑期多校训练营(第十场)
- CG CTF MISC Remove Boyfriend
- 【笔记 】栈底层 循环队列的处理 链栈 链队列