摘要:类提供了硬件级别的原子操作,主要提供了以下功能通过类可以分配内存,可以释放内存。方法获取对象中偏移地址对应的型的值数组元素定位类中有很多以结尾的常量,比如,等,这些常量值是通过方法得到的。可以终止一个挂起的线程,使其恢复正常。
java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,主要提供了以下功能:
1、通过Unsafe类可以分配内存,可以释放内存。类中提供的3个本地方法allocateMemory、reallocateMemory、freeMemory分别用于分配内存,扩充内存和释放内存,与C语言中的3个方法对应。
2、可以定位对象某字段的内存位置,也可以修改对象的字段值,即使它是私有的。字段的定位:JAVA中对象的字段的定位可能通过staticFieldOffset方法实现,该方法返回给定field的内存地址偏移量,这个值对于给定的filed是唯一的且是固定不变的。getIntVolatile方法获取对象中offset偏移地址对应的整型field的值,支持volatile load语义。getLong方法获取对象中offset偏移地址对应的long型field的值
数组元素定位:Unsafe类中有很多以BASE_OFFSET结尾的常量,比如ARRAY_INT_BASE_OFFSET,ARRAY_BYTE_BASE_OFFSET等,这些常量值是通过arrayBaseOffset方法得到的。arrayBaseOffset方法是一个本地方法,可以获取数组第一个元素的偏移地址。Unsafe类中还有很多以INDEX_SCALE结尾的常量,比如 ARRAY_INT_INDEX_SCALE,ARRAY_BYTE_INDEX_SCALE等,这些常量值是通过arrayIndexScale方法得到的。arrayIndexScale方法也是一个本地方法,可以获取数组的转换因子,也就是数组中元素的增量地址。将arrayBaseOffset与arrayIndexScale配合使用,可以定位数组中每个元素在内存中的位置。
3、挂起与恢复将一个线程进行挂起是通过park方法实现的,调用 park后,线程将一直阻塞直到超时或者中断等条件出现。unpark可以终止一个挂起的线程,使其恢复正常。整个并发框架中对线程的挂起操作被封装在 LockSupport类中,LockSupport类中有各种版本pack方法,但最终都调用了Unsafe.park()方法。
4、CAS操作是通过compareAndSwapXXX方法实现的
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/67025.html
摘要:本身不直接支持指针的操作,所以这也是该类命名为的原因之一。中的许多方法,内部其实都是类在操作。 showImg(https://segmentfault.com/img/remote/1460000016012251); 本文首发于一世流云的专栏:https://segmentfault.com/blog... 一、Unsafe简介 在正式的开讲 juc-atomic框架系列之前,有...
摘要:典型应用锁和同步器框架的核心类,就是通过调用和实现线程的阻塞和唤醒的,而的方法实际是调用的方式来实现。 前言 Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Java语言拥有了类似C语言指针...
摘要:该类将整数值与引用关联起来,可用于原子的更数据和数据的版本号。 CAS的全称为Compare And Swap,直译就是比较交换。是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值,其实现方式是基于硬件平台的汇编指令,在intel的CPU中,使用的是cmpxchg指令,就是说CAS是靠硬件实现的,从而在硬件层面提升效率。 CSA 原理 利用CP...
摘要:它的目的是为了增强语言直接操作底层资源的能力,无疑带来很多方便。这样可以有效避免多线程环境下的同步问题。另外还有的匿名内部类的生成,数组内存操作等。 本文原创地址,我的博客:jsbintask的博客(食用效果最佳),转载请注明出处! 简介 Unsafe是jdk提供的一个直接访问操作系统资源的工具类(底层c++实现),它可以直接分配内存,内存复制,copy,提供cpu级别的CAS乐观锁等操作...
摘要:不难看出,方法的内部,必然是使用原子指令来完成的。它是一个内部使用的专属类。注意根据类加载器的工作原理,应用程序的类由加载。加载器没有对象的对象,因此试图获得这个类加载器会返回。 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现。现在,就让我们更进一步看一下它把!public final boolean co...
摘要:前言为了研究对原子类的实现,从类开始,分析如果对原子操作的实现。保存着基础数据,使用修饰,可以保证该值对内存可见,也是原子类实现的理论保障。使用自旋锁来处理并发问题。 前言 为了研究Java对原子类的实现,从AtomicInteger类开始,分析Java如果对原子操作的实现。 什么是原子操作? 原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何...
阅读 3222·2021-11-15 11:37
阅读 1012·2021-11-02 14:45
阅读 3873·2021-09-04 16:48
阅读 3553·2019-08-30 15:55
阅读 721·2019-08-23 17:53
阅读 963·2019-08-23 17:03
阅读 1997·2019-08-23 16:43
阅读 2166·2019-08-23 16:22