jdk之原子类AtomicXXXX(预备篇)

    在介绍jdk原子类之前,我们先介绍一个非常重要的知识点:Unsafe类

1:Unsafe是什么

     Java自己是不能直接访问底层操作系统,如果要访问该怎么办呢?Unsafe类恰恰这个能力,能直接原子性的,硬件级别的提供该能力。

    Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,同时也带来了指针的问题。过度的使用Unsafe类会使得出错的几率变大,因此Java官方并不建议使用的,官方文档也几乎没有,实际编码中,我们也是不能使用的,否则会报异常。

    虽然Java官方不建议使用,但是我们应该了解它具备哪些方面的能力,知道后对我们后期的代码研读有较好的帮助。

2:Unsafe功能(仅列出我们需要主要了解的)

2.1:对象实例化。

      常见方式是我们用new或者反射来实例化对象,unsafe使用allocateInstance()方法可以直接生成对象实例,并且无需调用构造方法和其它初始化方法。

2.2:操作类、对象、变量。

   这部分包括了staticFieldOffset(静态域偏移)、defineClass(定义类)、defineAnonymousClass(定义匿名类)、ensureClassInitialized(确保类初始化)、objectFieldOffset(对象域偏移)等方法。

        通过这些方法我们可以获取对象的指针,通过对指针进行偏移,我们不仅可以直接修改指针指向的数据(即使它们是私有的),甚至可以找到JVM已经认定为垃圾、可以进行回收的对象。

2.3:操作数组。

    这部分包括了arrayBaseOffset(获取数组第一个元素的偏移地址)、arrayIndexScale(获取数组中元素的增量地址)等方法。arrayBaseOffset与arrayIndexScale配合起来使用,就可以定位数组中每个元素在内存中的位置。

2.4:CAS操作

    Unsafe类的CAS(compareAndSwap比较替换)操作可能是用的最多的,它为Java的锁机制提供了一种新的解决办法,比如AtomicXXX等类都是通过该方法来实现的。

2.5:线程挂起与恢复。

      通过park方法实现将一个线程进行挂起,调用 park后,线程将一直阻塞直到超时或者中断等条件出现。unpark可以终止一个挂起的线程,让其恢复正常。整个并发框架中对线程的挂起操作被封装在 LockSupport类(后续介绍锁时详细介绍)中。


弄清楚Unsafe是什么,它具备些什么能力后,我们可以开始我们的“原子类之旅”了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值