`
xiemingmei
  • 浏览: 207665 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多
我们写程序,一般不直接使用Unsafe类。 JDK的类特别是并发框架中大量使用到Unsafe的功能,比如:AtomicInteger, LockSupport.所以,了解Unsafe提供的功能与机制是非常必要的。

如何获取Unsafe对象?
		Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe");
		theUnsafeInstance.setAccessible(true);
		return (Unsafe) theUnsafeInstance.get(Unsafe.class);



功能1:操作对象的属性, 可以绕过private关键字。

		TestUnsafe a = (TestUnsafe) unsafe.allocateInstance(aClass);
		Field f = TestUnsafe.class.getDeclaredField("num");
		long offset = unsafe.objectFieldOffset(f);
		unsafe.compareAndSwapInt(a, offset, 0, 2);
		System.out.println(a);


功能2:直接操作DirectBuffer,高效。

File counters = new File(System.getProperty("java.io.tmpdir"), "counters.deleteme");
		System.out.println(counters.getAbsolutePath());
        counters.deleteOnExit();
        FileChannel fc = new RandomAccessFile(counters, "rw").getChannel();
        MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_WRITE, 0, 1024);
        long address = ((DirectBuffer) mbb).address();        
        int value = unsafe.getIntVolatile(null, address);
        System.out.println("---" + value);
        System.out.println(unsafe.compareAndSwapInt(null, address, value, 2));




功能3:线程的阻塞与唤醒:
		Thread t = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("线程t阻塞");
				unsafe.park(false, 0l);
				System.out.println("线程t唤醒");
			}
		});
		t.start();
		
		Thread.sleep(10000);
        //线程挂起和恢复
//		unsafe.park(false,1000*1000*1000*100); //nanosecond
		System.out.println("唤醒t!");
		unsafe.unpark(t);



功能4:CAS操作:
		TestUnsafe a = (TestUnsafe) unsafe.allocateInstance(aClass);
		Field f = TestUnsafe.class.getDeclaredField("num");
		long offset = unsafe.objectFieldOffset(f);
		unsafe.compareAndSwapInt(a, offset, 0, 2);
		System.out.println(a);







分享到:
评论

相关推荐

    CS使用Unsafe的方法向DLL传参

    CS使用Unsafe的方法向DLL传参 由一个实例开始: c++中函数声明如下: bool Test(float** arr,int rows,int cols); 这个函数在C#中怎么使用,直接传入single[,]出现错误”尝试读取或写入受保护的内存",那到底...

    Java Unsafe类的使用.docx

    CAS算法的出现使得在不使用synchronize这种“悲观锁”依然可以实现数据的安全访问,CAS算法是指先读取要修改的变量值,对它进行计算,然后执行检查并更新这个步骤(更新前判断那个值是否是之前那个读到的值),检查...

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

    unsafe-helper-包含一些简单的方法,这些方法使使用sun.misc.Unsafe更容易。 unsafe-collection-在ArrayList上建模的示例列表,该列表不存储对集合内对象的引用,而是直接将元素复制到列表中。 这有一些有趣的特性...

    Memory.Unsafe:使用非托管内存和指针的不安全方法

    以完全通用的非类型安全方式使用指针和非托管内存的不安全方法。 NuGet 当前的NuGet软件包名称为DotNetCross.Memory.Unsafe 。 在这里能找到它: 已过时的NuGet软件包名称和URL 不幸的是,当我第一次创建nuspec ...

    unsafe:是否想尝试Rust不安全{}? 仍然坚持使用Ruby? 这个给你

    仍然坚持使用Ruby? 这个给你。 一颗宝石中的所有善良 没有垃圾收集器 空指针 不确定。 用法 #!/usr/bin/env ruby # -- encoding: utf-8 -- require 'unsafe/unsafe' CHANCE_OF_DOOM = 0.5 unsafe { ( 1 .. 10 ) ...

    贝岭的matlab的代码-unsafe-search:谷歌图片搜索但NSFW;)

    用法 pip install -r requirements.txt 在(不附属,我讨厌它)上注册 Google 搜索 API 实用程序 设置DFS_USERNAME DFS_PASSWORD环境变量 示例代码: >> > unsafe_searcher = UnsafeSearcher () >> > unsafe_...

    基于C++/CLI的VB.NET/C#内存指针访问类库 .

    大家知道,VB.NET/C#在指针的使用上是受到很多限制的。虽然C#提供了unsafe代码的指针访问,但还是有不少限制。.NET Framework的类库提供了GCHandle类库和Marshal命名空间内存访问方法,但一来速度比较慢,二来访问时...

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

    在Java多线程中,当需要阻塞或者唤醒一个线程时,都会使用LockSupport工具类来完成相应的工作。LockSupport定义了一组公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能,而LockSupport也因此成为了构建同步...

    C#几种关键字用法总结.zip

    C# 不安全代码关键字:unsafe、C# 关键字const 和 readonly、C# 关键字extern用法、C#关键字Fixed、C#关键字IntPtr、C#关键字之override详解、C#中DllImport用法汇总、C#中的IntPtr

    Rust常见面试题.pdf

    请说明在Rust中的借用原理和使用方法。 5. 什么是Rust中的生命周期(Lifetime)?请说明在Rust中的生命周期概念和生命周期标识符。 6. Rust中的模式匹配(Pattern Matching)是什么?请说明在Rust中的模式匹配用法。...

    MaQiaoStringBuilder:使用unsafe实际与StringBuilder相似的功能,只支持(++=),暂不支持(+-=)

    此工具先期适用于(++=)模式,暂不提供(+-=)模式系统初始化 有前导Byte用完后必须使用free()方法释放内存,因为UNSAFE不参与jvm回收因为使用AutoCloseable接口,最好把对象定义放在try资源中,try会自动关闭注意:如...

    eslint-plugin-no-unsafe-chars:eslint插件,不允许在函数名称,变量名称和对象属性名称中使用德语变音符和其他不安全字符

    用法 将eslint-plugin-no-unsafe-chars为dev依赖项: $ npm install --save-dev eslint-plugin-no-unsafe-chars 通过将插件添加到您的.eslintrc来启用该插件: plugins: [ " no-unsafe-chars " ] 配置 您可以...

    Rust-Unsafe-Analyzer

    防锈不安全分析仪包括主脚本(标题为rustUnsafeAnalyzer.py)以及tests文件夹中的玩具示例。 根据示例的特定超级功能用法,将示例进一步细分为文件夹。

    MessageBox3.cs

    // 使用了获取变量地址的指针运算符& } Console.WriteLine("交换后:a = {0}, b = {1}", a, b); } // 声明不安全方法 static unsafe void Swap(int* a, int* b) { int tmp = *a; *a = *b; *b = tmp; }...

    serialization-unsafe

    支持的类型: 所有原始类型和包装器原始类型数组细绳用户名###用法例如,我们有一个要序列化的类 public class TestObj { private Integer integer; private long l; private someString s; ..... getters and ...

    Hibernate的事务处理机制和flush方法的用法.docx

    关于在使用 hibernate 在提交事务时常遇到的异常: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session) ...其实这个异常一般都是和我们在...

    pre:一个Rust板条箱,为使用不安全的代码提供编译时帮助

    预先 pre是一个库,可以帮助程序员正确维护函数调用的前提条件。 它主要用于unsafe函数,因为它们的前提条件在编译时... 当在unsafe块之外使用unsafe函数时,编译器(从1.44.1版本开始)甚至会宣告这种方法: note: con

    cargo-osha:一个Cargo插件来列出Rust项目中的不安全代码

    货运-奥沙列出Rust项目中不安全代码的程序。 实际上还不是货物插件。... 在460种方法中,其中14种是unsafe ,依此类推。 来自ggez示例,一个板条箱主要使用提供安全包装程序的依赖项,因此本身几乎不需要安全的代

    hoobsd:经过认证的HOOBS智能家居堆栈的服务器组件

    需要使用--unsafe-perm标志,以便安装可以在/usr/bin添加符号链接。 用法 要开始使用HOOBS,您首先需要初始化系统。 sudo hoobs initilize 系统将要求您设置端口。 然后,如果您已在系统上系统化或启动,它将自动...

    C#通过指针实现快速拷贝的方法

    // 编译时使用:/unsafe using System; class Test { // unsafe 关键字允许在下列 // 方法中使用指针: static unsafe void Copy(byte[] src, int srcIndex, byte[] dst, int dstIndex, int count) { if (src =...

Global site tag (gtag.js) - Google Analytics