`
IXHONG
  • 浏览: 446506 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中的Unsafe

    博客分类:
  • Java
阅读更多

在阅读AtomicInteger的源码时,看到了这个类:sum.msic.Unsafe,之前从没见过。所以花了点时间google了一下。

 

Unsafe的源码:http://www.docjar.com/html/api/sun/misc/Unsafe.java.html

 

Unsafe源码中的描述如下:

 

 写道
A collection of methods for performing low-level, unsafe operations. Although the class and all methods are public, use of this class is limited because only trusted code can obtain instances of it.

  这个类是用于执行低级别、不安全操作的方法集合。尽管这个类和所有的方法都是公开的(public),但是这个类的使用仍然受限,你无法在自己的java程序中直接使用该类,因为只有授信的代码才能获得该类的实例。

从上面的描述,可以了解到该类是用来执行较低级别的操作的,比如获取某个属性在内存中的位置,不过一般人很少会有这样的需求。在AtomicInteger的源码中相关的代码如下:

 

Java代码  收藏代码
  1. // setup to use Unsafe.compareAndSwapInt for updates  
  2. private static final Unsafe unsafe = Unsafe.getUnsafe();  

  上面这行代码是获取Unsafe实例的。一般情况下,我们是拿不到该类的实例的,当然jdk库里面是可以随意使用的。

 

Java代码  收藏代码
  1. static {  
  2.      try {  
  3.        valueOffset = unsafe.objectFieldOffset  
  4.            (AtomicInteger.class.getDeclaredField("value"));  
  5.      } catch (Exception ex) { throw new Error(ex); }  
  6.    }  

 

  上面这几行代码,是用来获取AtomicInteger实例中的value属性在内存中的位置。这里使用了Unsafe的objectFieldOffset方法。这个方法是一个本地方法, 该方法用来获取一个给定的静态属性的位置。

 

Java代码  收藏代码
  1. public native long objectFieldOffset(Field f);  

 

这里有个疑问,为什么需要获取属性在内存中的位置?通过查看AtomicInteger源码发现,在这样几个地方使用到了这个valueOffset值:

 

Java代码  收藏代码
  1. public final void lazySet(int newValue) {  
  2.         unsafe.putOrderedInt(this, valueOffset, newValue);  
  3.     }  

 

Java代码  收藏代码
  1. public final boolean compareAndSet(int expect, int update) {  
  2.     return unsafe.compareAndSwapInt(this, valueOffset, expect, update);  
  3.     }  

 

Java代码  收藏代码
  1. public final boolean weakCompareAndSet(int expect, int update) {  
  2.     return unsafe.compareAndSwapInt(this, valueOffset, expect, update);  
  3.     }  

 

  查找资料后,发现lazySet方法大多用在并发的数据结构中,用于低级别的优化。compareAndSet这个方法多见于并发控制中,简称CAS(Compare And Swap),意思是如果valueOffset位置包含的值与expect值相同,则更新valueOffset位置的值为update,并返回true,否则不更新,返回false。(valueOffset代表内存地址)

这里可以举个例子来说明compareAndSet的作用,如支持并发的计数器,在进行计数的时候,首先读取当前的值,假设值为a,对当前值 + 1得到b,但是+1操作完以后,并不能直接修改原值为b,因为在进行+1操作的过程中,可能会有其它线程已经对原值进行了修改,所以在更新之前需要判断原值是不是等于a,如果不等于a,说明有其它线程修改了,需要重新读取原值进行操作,如果等于a,说明在+1的操作过程中,没有其它线程来修改值,我们就可以放心的更新原值了。

 

Unsafe类中还包含有很多其它的方法,如果想使用其中的方法,可以通过反射机制拿到Unsafe中的一个静态属性theUnsafe ,这个静态属性本身已经初始化了,所以拿到以后可以直接使用。

0
0
分享到:
评论

相关推荐

    Java中unsafe操作实例总结

    Java中unsafe操作实例总结 Java中unsafe操作是Java无锁操作的基石,在无锁并发类中都少不了它们的身影,比如ConcurrentHashMap、ConcurrentLinkedQueue等都是由Unsafe类来实现的。Unsafe类提供了多种操作,包括...

    JDK8中sun.misc下UnSafe类源代码 UnSafe.java

    在Java编程中,sun.misc.UnSafe类是一个非常特殊的存在。这个类在JDK8中扮演着一个核心的角色,它提供了对Java语言规范中未公开的底层操作的访问。尽管UnSafe类并非设计为公共API的一部分,但它因其强大的功能而被...

    一篇看懂Java中的Unsafe类

    Java中的`Unsafe`类是一个非常特殊的工具类,它位于`sun.misc`包下,不属于Java标准库的一部分。尽管如此,由于其强大的底层操作能力,它在许多高性能的Java框架和库中扮演着重要角色,例如Netty、Hadoop和Kafka。`...

    UnsafeMe:java中Unsafe类的Protopye使用

    不安全的我 使用关键但非常快的序列化对象的简单库。 使用这部进行解释。 ##Warning 这个库是一个... 原因很简单:Unsafe 类的任何错误都不会导致异常,而是会导致 VM 崩溃! 使用风险自负。 ##许可证麻省理工学院

    Java Unsafe类1

    Java中的`Unsafe`类是一个非常特殊且强大的工具类,它提供了对Java内存模型的底层访问。这个类在`sun.misc`包下,由于其潜在的危险性和不稳定性,官方并不推荐直接使用,甚至在Java 9之后有计划移除部分功能。然而,...

    Java Unsafe类的使用.docx

    总的来说,Java的Unsafe类虽然强大且高效,但其内部操作直接触及JVM的底层,使用不当可能会引发安全问题,因此在实际开发中应谨慎使用,通常只在对性能有极致追求或者需要自定义高级并发数据结构时考虑。理解并恰当...

    简单谈一谈Java中的Unsafe类

    Java中的`Unsafe`类是一个非常特殊且强大的工具,它允许开发者绕过Java的常规安全机制,直接进行底层的内存操作和线程控制。虽然官方不推荐在常规开发中使用,但`Unsafe`类在某些高性能和低延迟的应用场景中扮演着...

    sun.misc.Unsafe源码

    在Java编程语言中,`sun.misc.Unsafe`类是一个神秘而强大的工具,它提供了对内存的直接操作和访问,绕过了Java的一些安全限制。这个类通常不被推荐在生产环境中直接使用,因为它的使用涉及到底层内存操作,可能会...

    java魔法类:Unsafe应用

    java魔法类:Unsafe应用

    java Unsafe详细解析

    Unsafe为我们提供了访问底层的机制,这种机制仅供java核心类库使用,而不应该被普通用户使用。但是,为了更好地了解java的生态体系,我们应该去学习它,去了解它,不求深入到底层的C/C++代码,但求能了解它的基本...

    Java Unsafe类实现原理及测试代码

    Java中的`Unsafe`类是一个非常底层的工具类,它提供了对内存操作的直接访问,类似于C语言中的指针。由于其强大的能力,`Unsafe`类能够执行一些常规Java API无法完成的任务,但也正因为这种能力,它也可能带来安全...

    JDK Unsafe 源码注释

    虽然Oracle发行的JDK版本不包含Unsafe的源代码,但在并发编程中,Unsafe类为java.util.concurrent包里的类提供了底层支持,例如通过提供绕过JVM直接修改内存的能力和使用硬件CPU指令实现CAS(Compare-And-Swap)原子...

    JDK8中sun.misc包下的UnSafe类

    JDK8中sun.misc包下的UnSafe类,想查看源码的就拿走,没积分的请与我联系!xtfggef@gmail.com

    Java并发编程之LockSupport、Unsafe详解.docx

    在Java并发编程中,LockSupport和Unsafe是两个关键的工具类,它们提供了底层的线程控制功能,使得开发者能够深入地管理和控制线程的行为。LockSupport是Java并发库中的一个核心工具类,它提供了线程的阻塞和唤醒功能...

    Unsafe.java

    JDK8中sun.misc下UnSafe类源代码 UnSafe.java

    Java中的魔法类:sun.misc.Unsafe示例详解

    Java中的`sun.misc.Unsafe`类是一个特殊的存在,它提供了对Java语言规范之外的底层操作的访问。这个类主要用于优化性能和实现一些JVM级别的功能,但同时也因为其潜在的安全风险和不稳定因素,通常不推荐在常规编程中...

    UnsafeAdapter:一个工具包,用于协助使用Java Unsafe类来分配和管理本地堆外内存块

    Java的`Unsafe`类是Java语言中一个强大的工具,它提供了对内存的直接访问和控制,包括在堆外分配内存、执行无同步的字节码操作等。然而,由于其潜在的安全风险和易用性的缺乏,`Unsafe`通常被封装在高级库中供开发者...

    Unsafe_jdk1.5_rt.jar

    《深入理解Java Unsafe类在JDK 1.5中的应用》 在Java编程语言中,`Unsafe`类是一个特殊的存在,它提供了对内存操作的直接访问权限,绕过了Java的一些安全机制。在JDK 1.5版本的`rt.jar`库中,`Unsafe`类扮演着一个...

    unsafe:使用sun.misc.Unsafe的各种Java类

    这个Unsafe类允许直接访问JVM中的内存,这是非常危险的,但是很有趣:)。 unsafe-helper-包含一些简单的方法,这些方法使使用sun.misc.Unsafe更容易。 unsafe-collection-在ArrayList上建模的示例列表,该列表不...

    Java 多线程与并发(8-26)-JUC原子类- CAS, Unsafe和原子类详解.pdf

    Java多线程与并发处理是Java编程中的高级话题,涉及到JUC(java.util.concurrent)包中的原子类、CAS(Compare-And-Swap)机制、Unsafe类以及多线程并发的无锁方案和线程安全的实现方法。 CAS是一种无锁的同步机制...

Global site tag (gtag.js) - Google Analytics