要想把java并发包学好,并明白其底层的设计原理,Unsafe类你不能不去研究一下。下面介绍一下Unsafe类的功能以及它在JDK中的应用。

一、分配内存和释放内存

功能:类中提供的3个本地方法allocateMemory、reallocateMemory、freeMemory分别用于分配内存,扩充内存和释放内存。

应用:在java nio包里有一个DirectByteBuffer,其对象所引用的空间是JVM堆以外的内存,又称直接内存,此内存的分配就是调用unsafe对象的allocateMemory实现。

二、定义对象某字段的偏移地址,并通过偏移地址修改或获得某对象的字段

功能:通过调用Unsafe对象的objectFieldOffset,传入一个Field参数,可以获取到此Feild参数所在对象的偏移地址(一个long型的整数)。然后调用putXXX方法修改某个对象的此feild的值

应用:LockSupport类的park(Object blocker)方法,当调用此方法时,此方法会调用unsafe的putObject方法,将blocker对象设置到当前线程的parkBlocker字段上

三、挂起和恢复线程

功能:调用Unsafe的park方法可以挂起一个线程,调用unpark可以恢复一个线程

应用:LockSupport类的park方法和unpark方法都是调用的unsafe的对应方法。详情可以阅读源码

四、CAS

功能:CAS 就是比较和设置的缩写。这是原子性线程安全操作的重要思想,类似于hibernate的乐观锁。其原理是:CAS操作有3个操作数,内存值M,预期值E,新值U,如果M==E,则将内存值修改为U,否则啥都不做。。代码形式如下:

while(true){

int a = get();

int newVal = a+1;

if(unsafe.compareAndSwapInt(a,newVal)){//如果设置成功则跳出死循环,否则一直循环下去,直到设置新值成功。

break;

}

}

CAS功能的实现就是通过调用Unsafe对象的compareAndSwapXXX()方法,此方法时本地实现,与系统底层密切相关,CAS是一个cpu指令,所以它具有原子性,也就是说,Unsafe的compareAndSwap方法从内存里取值,然后比较,在通过比较结果进行设置新值的操作都是原子性不可分割的。

应用:unsafe的此功能在java并发包用的是相当的多。比如并发包的锁机制,非阻塞的队列,还有atomicXXX这些原子类也都使用了Unsafe的这个功能。详情可以看源码。

这是获取Unsafe对象的方法:

public static Unsafe getUnsafe() throws Exception{
  Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe");
  theUnsafeInstance.setAccessible(true);
  return (Unsafe) theUnsafeInstance.get(Unsafe.class);
}

总结:个人觉着学习并发包,不应该照着API文档去读每个类每个方法的用法,而是找一下案例看一下大概是如何使用,这样你可以很快速的会使用这些类,如果还有什么疑惑,或者想明白其中原理,可以直接查看源代码,当然你可以大体看一下了解一下原理,没必要死扣非得要完全搞明白。会用用好就挺好的。嘿嘿,不早了,先写到这吧。希望大家给我指出宝贵的意见

Unsafe的应用的更多相关文章

  1. unsafe

    今天无意中发现C#这种完全面向对象的高级语言中也可以用不安全的指针类型,即要用到unsafe关键字.在公共语言运行库 (CLR) 中,不安全代码是指无法验证的代码.C# 中的不安全代码不一定是危险的, ...

  2. go-使用 unsafe 修改 struct 中的 field 的值

    以下是方法,不要纠结原理,等东西积累多了,你才有能力纠结原理: 首先,你需要有一个这样的函数,这是在 nsq 的源码里直接抄过来的: func unsafeValueOf(val reflect.Va ...

  3. 【实战Java高并发程序设计 1】Java中的指针:Unsafe类

    是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...

  4. C#+无unsafe的非托管大数组(large unmanaged array in c# without 'unsafe' keyword)

    C#+无unsafe的非托管大数组(large unmanaged array in c# without 'unsafe' keyword) +BIT祝威+悄悄在此留下版了个权的信息说: C#申请一 ...

  5. c中使用gets() 提示warning: this program uses gets(), which is unsafe.

    今天在C代码中使用gets()时提示“warning: this program uses gets(), which is unsafe.”,然后这个程序还能运行,无聊的我开始查阅资料,为啥gets ...

  6. sun.misc.Unsafe的理解

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

  7. [Java 基础]sun.misc.Unsafe

    使用Unsafe可以干一些好事. Unsafe对象初始化 如果你的代码属于trusted的,可以直接使用下面的方式: public static Unsafe getUnsafe() { Class ...

  8. vs2012 error c4996: This function or variable may be unsafe

    编译lua源码时,使用vs2012,遇到如下错误. 1>------ 已启动生成: 项目: 20130925, 配置: Debug Win32 ------ 1>  stdafx.cpp ...

  9. 配置OpenCV产生flann\logger.h(66): error C4996: 'fopen': This function or variable may be unsafe问题[zz]

    使用vs2012/2013配置opencv编译出现问题: 1>------ 已启动生成: 项目: Win32ForOpenCV245, 配置: Debug Win32 ------ 1> ...

  10. error C4996: 'fopen': This function or variable may be unsafe.

    vs2013中错误提示信息: error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s ...

随机推荐

  1. 开始VS 2012中LightSwitch系列的第5部分:我可以使用用户权限来控制访问权吗?

    [原文发表地址]  Beginning LightSwitch in VS 2012 Part 5: May I? Controlling Access with User Permissions [ ...

  2. 《JAVA与模式》之抽象工厂模式

    场景问题 举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU.硬盘.内存.主板.电源.机箱等.为讨论使用简单点,只考虑选择CPU和主板的问题. 事实上,在选择 ...

  3. jenkins + Git 搭建持续集成环境

    持续集成通过自动化构建.自动化测试以及自动化部署加上较高的集成频率保证了开发系统中的问题能迅速被发现和修复,降低了集成失败的风险,使得系统在开发中始终保持在一个稳定健康的集成状态.jenkins是目前 ...

  4. 在GitHub注册账户的过程

    (1)第一步:首先起一个属于自己用户的名字(username),用户名字只能包含字母数字的字符或者单个连字符,不能只用单个连字符开始或者结束(only contain alphanumeric cha ...

  5. Homework 3

    1. 是否需要有代码规范? 这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. (反对) 我是个艺术家,手艺人,我有自己的规范和原则.  (反对) 规范不能强求一律, ...

  6. [ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭

    1.CC2530的IO口概述 CC2530芯片有21 个数字输入/输出引脚,可以配置为通用数字I/O 或外设I/O 信号,配置为连接到ADC.定时器或USART外设.这些I/O 口的用途可以通过一系列 ...

  7. 自己封装个ajax

    你是否发现项目中有很多页面只用到了框架不到十分之一的内容,还引了压缩后还有70多kb的jquery库 你是否发现项目中就用了两三个underscore提供的方法,其他大部分的你方法你甚至从来没有看过 ...

  8. MVVM架构~knockoutjs系列之为Ajax传递Ko数组对象

    返回目录 一些要说的 这是一个很有意思的题目,在KO里,有对象和数组对象两种,但这两种对象对外表现都是一个function,如果希望得到他的值,需要进行函数式调用,如ko_a(),它的结果为一个具体值 ...

  9. WinMTR

    一般在windows 来判断网络连通性用ping 和tracert,ping的话可以来判断丢包率,tracert可以用来跟踪路由. 在Linux中有一个好用的网络连通性判断工具,它可以结合ping n ...

  10. angular的$resource factory都有啥

    angular的$resource factory都有啥 A factory which creates a resource object that lets you interact with R ...