2019独角兽企业重金招聘Python工程师标准>>>

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html,而后自己结合hotspot源码看的

1.sun.misc.Unsafe中CAS方法

在sun.misc.Unsafe中CAS方法如下:

  1. compareAndSwapObject(java.lang.Object arg0, long arg1, java.lang.Object arg2, java.lang.Object arg3);
  2. compareAndSwapInt(java.lang.Object arg0, long arg1, int arg2, int arg3);
  3. compareAndSwapLong(java.lang.Object arg0, long arg1, long arg2, long arg3);

来看下openJDK8的hotspot中,unsafe是如何实现的,链接http://hg.openjdk.java.net/jdk8u/jdk8u60/hotspot/file/37240c1019fd/src/share/vm/prims/unsafe.cpp

图1

List-1

UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject e_h, jobject x_h))UnsafeWrapper("Unsafe_CompareAndSwapObject");oop x = JNIHandles::resolve(x_h);//更新后的值oop e = JNIHandles::resolve(e_h);//期望值oop p = JNIHandles::resolve(obj);//更新的对象HeapWord* addr = (HeapWord *)index_oop_from_field_offset_long(p, offset);//获取偏移地址,可以理解为获取要更新的属性的内存地址oop res = oopDesc::atomic_compare_exchange_oop(x, addr, e, true);//调用方法执行CAS操作jboolean success  = (res == e);//atomic_compare_exchange_oop的返回值是否等于期望值,如果等于,则success为trueif (success)update_barrier_set((void*)addr, x);//更新memory barrierreturn success;
UNSAFE_END

atomic_exchange_oop声明在http://hg.openjdk.java.net/jdk8u/jdk8u60/hotspot/file/37240c1019fd/src/share/vm/oops/oop.hpp中,如下

List-2

  static oop atomic_compare_exchange_oop(oop exchange_value,volatile HeapWord *dest,oop compare_value,bool prebarrier = false);

实现在http://hg.openjdk.java.net/jdk8u/jdk8u60/hotspot/file/37240c1019fd/src/share/vm/oops/oop.inline.hpp中,如下List-3所示:

List-3

inline oop oopDesc::atomic_compare_exchange_oop(oop exchange_value,volatile HeapWord *dest,oop compare_value,bool prebarrier) {if (UseCompressedOops) {if (prebarrier) {update_barrier_set_pre((narrowOop*)dest, exchange_value);}// encode exchange and compare value from oop to TnarrowOop val = encode_heap_oop(exchange_value);narrowOop cmp = encode_heap_oop(compare_value);narrowOop old = (narrowOop) Atomic::cmpxchg(val, (narrowOop*)dest, cmp);//核心// decode old from T to oopreturn decode_heap_oop(old);} else {if (prebarrier) {update_barrier_set_pre((oop*)dest, exchange_value);}return (oop)Atomic::cmpxchg_ptr(exchange_value, (oop*)dest, compare_value);//核心}
}

如上的List-3所示,核心的CAS调用Atomic::cmpxchg(val, (narrowOop*)dest, cmp)和Atomic::cmpxchg_ptr(exchange_value, (oop*)dest, compare_value)。

cmpxchg的实现是在http://hg.openjdk.java.net/jdk8u/jdk8u60/hotspot/file/37240c1019fd/src/share/vm/runtime/atomic.cpp中,如下List-4所示

List-4

jbyte Atomic::cmpxchg(jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {assert(sizeof(jbyte) == 1, "assumption.");uintptr_t dest_addr = (uintptr_t)dest;uintptr_t offset = dest_addr % sizeof(jint);volatile jint* dest_int = (volatile jint*)(dest_addr - offset);jint cur = *dest_int;//对象当前值jbyte* cur_as_bytes = (jbyte*)(&cur);jint new_val = cur;jbyte* new_val_as_bytes = (jbyte*)(&new_val);new_val_as_bytes[offset] = exchange_value;//这里有个for循环,资料上说“ 比较当前值与期望值,如果相同则更新,不同则直接返回”?while (cur_as_bytes[offset] == compare_value) {jint res = cmpxchg(new_val, dest_int, cur);if (res == cur) break;cur = res;new_val = cur;new_val_as_bytes[offset] = exchange_value;}return cur_as_bytes[offset];
}

cmpxchg_ptr的实现由不同的系统而实现不同,以64位linux为例,是在http://hg.openjdk.java.net/jdk8u/jdk8u60/hotspot/file/37240c1019fd/src/os_cpu/linux_x86/vm/atomic_linux_x86.inline.hpp中

转载于:https://my.oschina.net/u/2518341/blog/1931106

openJDK之sun.misc.Unsafe类CAS底层实现相关推荐

  1. 聊聊高并发(十七)解析java.util.concurrent各个组件(一) 了解sun.misc.Unsafe类

    了解了并发编程中锁的基本原理之后,接下来看看Java是如何利用这些原理来实现各种锁,原子变量,同步组件的.在开始分析java.util.concurrent的源代码直接,首先要了解的就是sun.mis ...

  2. sun.misc.Unsafe类详解

    一.Unsafe类的作用 可以用来在任意内存地址位置处读写数据(可见,对于普通用户来说,使用起来还是比较危险的): 支持一些CAS原子操作: 二.获取Unsafe对象 以下sun.misc.Unsaf ...

  3. Eclipse导入sun.misc.Unsafe类及其源码

    一.Eclipse导入sun.misc.Unsafe类报错的解决方法 在eclipse中导入sun.misc.Unsafe类后,错误如图所示: 错误很明显,提示找不到这个类.具体解决方案如下: 点击W ...

  4. sun.misc.unsafe类的使用

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 这个帖子 ...

  5. 初识sun.msic.Unsafe类:CAS操作的核心类

    java不能直接访问操作系统底层,而是通过native本地方法来访问.Unsafe类提供了硬件级别的原子操作 juc并发包,即java.util.concurrent包,是JDK的核心工具包,是JDK ...

  6. 字体对话框java实验_Java Web安全 || Java基础 sun.misc.Unsafe

    点击上方"凌天实验室","星标或置顶公众号" 漏洞.技术还是其他,我都想第一时间和你分享 " [历史]已连载更新全部内容:[菜单栏]-[JAVA SE ...

  7. sun.misc.Unsafe的理解

    前言 以下sun.misc.Unsafe源码和demo基于jdk1.7: 最近在看J.U.C里的源码,很多都用到了sun.misc.Unsafe这个类,一知半解,看起来总感觉有点不尽兴,所以打算对Un ...

  8. sun.misc.Unsafe和堆外内存

    sun.misc.Unsafe类允许您执行许多Java中不应该做的事情,但是在非常特殊的情况下仍然有用. 必须在99%的时间避免这种情况,但是在极少数情况下,这是唯一有意义的解决方案. 这篇文章考虑了 ...

  9. sun.misc.Unsafe苦难告诉我们什么

    Oracle将删除Java 9中的内部sun.misc.Unsafe类 . 尽管大多数人可能对这种变化漠不关心,但其他一些人(主要是图书馆开发人员)并非如此. 博客圈中最近有几篇文章描绘了这种变化所暗 ...

最新文章

  1. Attention is All You Need?LSTM提出者:我看未必
  2. opencv orb
  3. activiti7可以两个网关连着用吗
  4. 华中科技大学计算机卓越计划,计算机卓越计划实验班培养计划.doc
  5. 阿里凑单算法首次公开!打包购商品挖掘系统解析
  6. 响应式web(一):什么是响应式web,异步调用,callback的本质,servlet3的异步
  7. vba根据内容调整word表格_给你的word提速
  8. toj 4608 Ball in a Rectangle
  9. 微软账号 被阻止登录会自动解锁码_WPS Office 13.2.0 国际解锁高级版 清爽无广告...
  10. Tosca:键盘输入字符串
  11. Spring【DAO模块】就是这么简单
  12. 变异检测VarScan软件使用说明
  13. Linux常用远程连接工具介绍,总有一款适合你
  14. 【智能优化算法】基于混合布谷鸟算法和灰狼算法求解带单目标优化问题附matlab代码
  15. ubuntu18字符终端不支持中文问题(汉字菱形)
  16. 重启计算机后ip丢失,win10系统重启后ip丢失的处理步骤
  17. C++char数据类型
  18. 推荐六本前端开发必看的书籍
  19. python两个表格相同数据筛选_如何将多个表格中数据筛选汇总在一个表格里?
  20. linux—rm命令详解(一天一个命令)

热门文章

  1. MFC界面库BCGControlBar v25.0新功能详解六:属性网格和其他
  2. snmpwalk用法
  3. asp.net动态换肤
  4. pytest+allure框架搭建(MacOS)
  5. Mac python3.x使用HTMLTestRunner.py生成html格式的测试报告
  6. SpringMVC框架 学习DAY_01:框架概括 / 简易应用 / 核心执行流程图 /在框架下显示HTML模板页面/ 接受请求
  7. Xamarin Android设置界面提示类型错误
  8. 内存储器和cpu一起构成了计算机,计算机系统的组成
  9. 十字星编程c语言,C语言求完整的代码
  10. harmonyos能否移植到MCU,HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验