当我们研究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 的原子性如何保证相关推荐

  1. java volatile 原子性_Java并发编程之验证volatile不能保证原子性

    Java并发编程之验证volatile不能保证原子性 通过系列文章的学习,凯哥已经介绍了volatile的三大特性.1:保证可见性 2:不保证原子性 3:保证顺序.那么怎么来验证可见性呢?本文凯哥(凯 ...

  2. java公平索非公平锁_Java 并发编程中使用 ReentrantLock 替代 synchronized

    Java 5 引入的 Concurrent 并发库软件包中,提供了 ReentrantLock 可重入同步锁,用来替代 synchronized 关键字原语,并可提供更好的性能,以及更强大的功能.使用 ...

  3. java对象不会被改变_Java 并发编程(二)对象的不变性和安全的公布对象

    二.安全公布 到眼下为止,我们重点讨论的是怎样确保对象不被公布,比如让对象封闭在线程或还有一个对象的内部.当然,在某些情况下我们希望在多个线程间共享对象,此时必须确保安全地进行共享.然而,假设仅仅是像 ...

  4. java list 占用内存不释放_Java并发编程 - CopyOnWrite容器类

    前言 当我们对List进行遍历的时候,如果list被修改了会抛出java.util.ConcurrentModificationException错误.那么有没有办法在遍历一个list的时候,还向li ...

  5. java限制一个接口的执行时间_Java 并发编程:任务执行器 Executor 接口

    任务执行器(Executor)是一个接口,位于java.util.concurrent包下,它的作用主要是为我们提供任务与执行机制(包括线程使用和调度细节)之间的解耦.比如我们定义了一个任务,我们是通 ...

  6. java赋值语句_java并发编程之原子性问题

    程序是否线程安全,取决于哪些要素呢,主要是以下三个: 原子性, 可见性, 有序性. 今天先一起来学习原子性. 原子性: 我理解一个操作不可再分,即为原子性.而在并发编程的环境中,原子性的含义就是只要该 ...

  7. java 如何知道对象是否被修改过_Java 并发编程:AQS 的原子性如何保证

    当我们研究AQS框架时(对于AQS不太熟知可以先阅读<什么是JDK内置并发框架AQS>,会发现AbstractQueuedSynchronizer这个类很多地方都使用了CAS操作.在并发实 ...

  8. 重点知识学习(8.2)--[JMM(Java内存模型),并发编程的可见性\原子性\有序性,volatile 关键字,保持原子性,CAS思想]

    文章目录 1.JMM(Java Memory Model) 2.并发编程的可见性 3.并发编程的有序性 4.并发编程的原子性 5.volatile 关键字 6.保持原子性: 加锁,JUC原子类 加锁 ...

  9. java cas机制_java并发编程中的CAS机制,你理解嘛?

    学习Java并发编程,CAS机制都是一个不得不掌握的知识点.这篇文章主要是从出现的原因再到原理进行一个解析.希望对你有所帮助. 一.为什么需要CAS机制? 为什么需要CAS机制呢?我们先从一个错误现象 ...

最新文章

  1. C# 获取指定目录下所有文件信息、移动目录、拷贝目录
  2. 混合SSVEP-P300 BCI生产双频SSVEP
  3. linux怎么同时查看两个文件,MultiTail - 在单个Linux终端中同时监视多个文件
  4. bdd cucumber_如何使用BDD构建坚如磐石的Ruby on Rails应用
  5. Android 系统(220)---如何快速对系统重启问题进行归类
  6. python怎么实现黑客攻击英国_注意!你的隐私就是这样被黑客获取的
  7. 面试官问我:什么是JavaScript闭包,我该如何回答?
  8. Pytorch使用记录
  9. android 控件随手指移动_Android 实习生面试经历记录
  10. 制造业ERP项目设计摘录
  11. 轻松获取windows10锁屏壁纸
  12. W806做电机转速调控
  13. 多标签用户画像分析跑得快的关键在哪里?
  14. Sansen精粹阅读笔记(1)OTA和OCA (电流放大器)
  15. Warshall沃舍尔算法
  16. Anaconda安装之后Spyder闪退解决办法
  17. 设计模式“6”大原则!
  18. SQL 查询当前时间
  19. Windows XP 源代码在线泄露
  20. golang中的图像image处理详解

热门文章

  1. 直播 | 清华大学李一鸣:后门攻击简介
  2. 首个金融领域的开源中文预训练语言模型FinBERT了解下
  3. 指哪分哪:交互式分割近期发展
  4. ACL 2019开源论文 | 基于Attention的知识图谱关系预测
  5. 在TensorFlow和PaddleFluid中使用多块GPU卡进行训练
  6. CentOS 7 从下载到安装
  7. class path resource [log4j.properties] cannot be resolved to URL because it does not exist
  8. 2019牛客暑期多校训练营(第十场)
  9. CG CTF MISC Remove Boyfriend
  10. 【笔记 】栈底层 循环队列的处理 链栈 链队列