是《实战Java高并发程序设计》第4章的几点。

如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现。现在,就让我们更进一步看一下它把!

public final boolean compareAndSet(int expect, int update){

returnunsafe.compareAndSwapInt(this, valueOffset, expect, update);

}

在这里,我们看到一个特殊的变量unsafe。它是sun.misc.Unsafe类型。从名字看,这个类应该是封装了一些不安全的操作。那什么操作是不安全的呢?学习过C或者C++的话,大家应该知道,指针是不安全的。这也是在Java中把指针去除的重要原因。如果指针指错了位置,或者计算指针偏移量时出错,结果可能是灾难性的,你很有可能会覆盖别人的内存,导致系统奔溃。

而这里的Unsafe就是封装了一些类似指针的操作。compareAndSwapInt()方法是一个navtive方法。它的几个参数含义如下:

public final native boolean compareAndSwapInt(Object o,long offset,int expected,int x);

第一个参数o为给定的对象,offset为对象内的偏移量(其实就是一个字段到对象头部的偏移量,通过这个偏移量可以快速定位字段),expected表示期望值,x表示要设置的值。如果指定的字段的值等于expected,那么就会把它设置为x。

不难看出,compareAndSwapInt()方法的内部,必然是使用CAS原子指令来完成的。此外,Unsafe类还提供了一些方法,主要有以下几个(以Int操作为例,其他数据类型是类似的):

//获得给定对象偏移量上的int值

public native int getInt(Object o, long offset);

//设置给定对象偏移量上的int值

public native void putInt(Object o, long offset, int x);

//获得字段在对象中的偏移量

public native long objectFieldOffset(Field f);

//设置给定对象的int值,使用volatile语义

public native void putIntVolatile(Object o, long offset,int x);

//获得给定对象对象的int值,使用volatile语义

public native int    getIntVolatile(Object o, long offset);

//和putIntVolatile()一样,但是它要求被操作字段就是volatile类型的

public native void putOrderedInt(Object o, long offset, intx);

如果大家还记得“3.3.4 深度剖析ConcurrentLinkedQueue”一节中的描述的ConcurrentLinkedQueue实现,应该对ConcurrentLinkedQueue中的Node还有些印象。Node一些CAS操作也都是使用Unsafe类来实现的。大家可以回顾一下,以加深对Unsafe类的印象。

这里就可以看到,虽然Java抛弃了指针。但是在关键时刻,类似指针的技术还是必不可少的。这里底层的Unsafe实现就是最好的例子。但是很不幸,JDK的开发人员并不希望大家使用这个类。获得Unsafe实例的方法是调动其工厂方法getUnsafe()。但是,它的实现却是这样:

public static Unsafe getUnsafe() {

Class cc =Reflection.getCallerClass();

if(cc.getClassLoader() != null)

throw newSecurityException("Unsafe");

return theUnsafe;

}

注意加粗部分的代码,它会检查调用getUnsafe()函数的类,如果这个类的ClassLoader不为null,就直接抛出异常,拒绝工作。因此,这也使得我们自己的应用程序无法直接使用Unsafe类。它是一个JDK内部使用的专属类。

注意:根据Java 类加载器的工作原理,应用程序的类由AppLoader加载。而系统核心类,如rt.jar中的类由Bootstrap类加载器加载。Bootstrap加载器没有Java对象的对象,因此试图获得这个类加载器会返回null。所以,当一个类的类加载器为null时,说明它是由Bootstrap加载的,而这个类也极有可能是rt.jar中的类。

这本书:

java unsafe获取指针_【实战Java高并发程序设计 1】Java中的指针:Unsafe类相关推荐

  1. 实战java高并发程序设计-笔记进行中

    <JAVA并发编程实践>:出书时间太早,内容比较散,专业术语翻译较早和现在有差异 <Java并发编程的艺术>:手绘图较多文字内容较少,主要讲解并发实现的底层原理和面临的问题,底 ...

  2. java 无锁缓存_如何在高并发环境下设计出无锁的数据库操作(Java版本)

    一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...

  3. Spring Boot实战解决高并发数据入库: Redis 缓存+MySQL 批量入库

    前言 最近在做阅读类的业务,需要记录用户的PV,UV: 项目状况:前期尝试业务阶段: 特点: 快速实现(不需要做太重,满足初期推广运营即可) 快速投入市场去运营 收集用户的原始数据,三要素: 谁 在什 ...

  4. 【实战Java高并发程序设计6】挑战无锁算法

    我们已经比较完整得介绍了有关无锁的概念和使用方法.相对于有锁的方法,使用无锁的方式编程更加考验一个程序员的耐心和智力.但是,无锁带来的好处也是显而易见的,第一,在高并发的情况下,它比有锁的程序拥有更好 ...

  5. 《实战Java高并发程序设计》github笔记和源码

    笔记 <实战Java高并发程序设计>中有很多代码范例,适合初学者通过实践入门并发编程,这本书有个问题就是前面的代码都用JDK7,第六章开始又用JDK8了 笔者做了相关笔记并整理源代码,欢迎 ...

  6. java 高并发第三阶段实战_Java 高并发第三阶段实战---Java并发包深入解析与使用详解...

    第三阶段的课程主要围绕着Java并发包的使用,展开详细的介绍,主要内容有1.原子包源码剖析,2.并发包工具类详细介绍,3.线程服务以及Future和callable等详细介绍,4.高并发容器和阻塞容器 ...

  7. 《实战Java高并发程序设计》.pdf

    关注"Java后端技术全栈" 回复"面试"获取全套面试资料 如今,秒杀已经变得十分常见,我们也都习以为常. 然而,从技术的角度来说,秒杀对于Web系统是一个巨大 ...

  8. 《实战 Java 高并发程序设计》笔记——第3章 JDK 并发包(二)

    文章目录 3.2 线程复用:线程池 3.2.1 什么是线程池 3.2.2 不要重复发明轮子:JDK 对线程池的支持 1. 固定大小的线程池 2. 计划任务 3.2.3 刨根究底:核心线程池的内部实现 ...

  9. 今天开始拜读一本大神写的书《实战Java高并发程序设计 》

    基本信息 书名:实战Java高并发程序设计 定价:69.00元 作者:葛一鸣著 出版社:电子工业出版社 出版日期:2015-10-01 ISBN:9787121273049 字数:493000 页码: ...

最新文章

  1. Xamarin Anroid开发教程之Anroid开发工具及应用介绍
  2. python 开发gui浏览器_Python编程之gui程序实现简单文件浏览器代码
  3. java写龟兔赛跑_简单的实现java多线程——龟兔赛跑
  4. sqlserver2008 创建支持文件流的数据库
  5. UNITY3D与iOS交互解决方案
  6. 天玑720支持鸿蒙系统吗,天玑720属于骁龙多少 天玑720处理器相当于骁龙几
  7. mongodb----副本集搭建及故障自动切换
  8. 苹果Apple Watch样机Mockups素材,你用过吗?
  9. 获取登录域帐号信息方式之 —-IIS(VB)
  10. rowStyle设置Bootstrap Table行样式
  11. 010 Editor v8.0.1(32 - bit) 算法逆向分析、注册机编写
  12. 阿里巴巴正式开源全球化OpenMessaging和ApsaraCache项目
  13. java获取系统字体大小_Java自动调整到Windows 7的字体大小调整
  14. 人力资源管理系统需求分析报告及系统架构图
  15. 官方解决方案:WPS for Mac 云字体删除的问题,Mac版WPS已下载云字体无法删除的问题
  16. 中了勒索病毒,该如何恢复数据?
  17. reduce具体使用以及使用reduce,toString,flat进行数组降维
  18. c语言命令笔记本电脑快捷键,实用的电脑操作技巧(附快捷键)
  19. 无线模块数据加密,反码校验,发送字符串ABCDEFGHIJKLMNOP LED频闪
  20. 井字棋小游戏代码(Visual Studio)

热门文章

  1. LeetCode简单题之交替位二进制数
  2. LeetCode简单题之删除排序链表中的重复元素
  3. 4D毫米波雷达Radar
  4. 将Tensor核心引入标准Fortran
  5. 3D MinkowskiEngine稀疏模式重建
  6. 广泛的信号处理链如何让语音助理“正常工作”
  7. Mysql悲观锁以及乐观锁案例说明
  8. [JAVAEE] 使用Postman测试接口
  9. HarmonyOS ListContainer 实现列表
  10. RecyclerView smoothScrollToPosition 和 scrollToPosition 的区别