`
xiemingmei
  • 浏览: 209358 次
  • 性别: 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#中调用C/C++编写的动态链接库(DLL)时,就可能遇到类型不匹配的问题。本文将通过一个...

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

    `objectFieldOffset`方法返回字段在对象内部的偏移量,然后可以使用`getXXX`和`putXXX`系列方法(如`getInt`、`putInt`)进行读写。 3. **类和对象操作**:UnSafe提供了诸如`defineClass`来动态定义类,`...

    JDK Unsafe 源码注释

    Unsafe类中的部分方法需要对JVM内部结构有深入的理解,例如获取和操作对象的字段偏移量,需要使用objectFieldOffset、staticFieldOffset、arrayBaseOffset和arrayIndexScale等方法来获取相应的偏移量。在使用这些...

    sun.misc.Unsafe源码

    6. **线程和运行时系统交互**:`Unsafe`还提供了与JVM运行时系统交互的方法,比如获取当前线程(`getThread`),获取或设置线程本地变量(`getThreadLocal`、`setThreadLocal`),甚至可以触发垃圾收集(`...

    Java Unsafe类的使用.docx

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

    解决VS中This function or variable may be unsafe的安全检查错误.docx

    在Visual Studio中,开发者可能会遇到一个警告或错误,提示"This function or variable may be unsafe",这是由于Microsoft引入的安全开发生命周期(Security Development Lifecycle, SDL)检查机制。该机制旨在提高...

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

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

    一篇看懂Java中的Unsafe类

    1. **实例化私有类**:通过反射获取`Unsafe`的实例,并使用`allocateInstance()`方法实例化私有构造器的类。这允许开发者绕过Java的正常构造器机制。 ```java Field f = Unsafe.class.getDeclaredField("theUnsafe...

    Unsafe_jdk1.5_rt.jar

    这段代码首先获取了`Unsafe`类的一个私有字段`theUnsafe`,然后通过`setAccessible(true)`方法绕过访问控制,最后获取到`Unsafe`实例。 `Unsafe`类提供的功能包括但不限于以下几个方面: 1. **内存管理**:可以...

    Java Unsafe类1

    `Unsafe`类允许开发者获取对象中某个字段的内存偏移量,这通过`objectFieldOffset(Field f)`方法完成。这个方法返回指定`Field`对象所表示的字段在对象内存布局中的偏移量。一旦得到偏移量,我们就可以通过`...

    go中的unsafe包及使用详解

    - 只有在其他安全的方法无法实现时,才考虑使用unsafe包。 - 需要对Go语言的内存模型有深入的理解。 - 需要对所操作的数据结构和类型有明确的认识。 - 在使用unsafe操作时,尽量缩短使用unsafe包代码的范围和时间。 ...

    解决VS中This function or variable may be unsafe的安全检查错误.pdf

    如果只是针对个别文件想忽略安全检查,则可以使用方法(2)和方法(3)。值得注意的是,虽然这样可以绕过编译器的安全检查,降低编译错误,但同时也可能使程序更容易遭受安全攻击。因此,如果决定不使用安全检查,...

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

    由于其潜在的风险,Unsafe类的使用受到限制,一般情况下,开发者不能直接实例化它,而是通过`Unsafe.getUnsafe()`静态方法获取。这个方法检查调用者的类加载器是否为系统域加载器,只有在满足条件的情况下才返回`...

    mapdb-unsafe:提供使用 sun.misc.Unsafe 提高 10% 的内存存储

    `DBMaker.newMemoryUnsafeDB().make()` 这个方法调用表示创建一个新的 MapDB 数据库实例,该实例将使用内存中的“不安全”模式进行存储。在这个模式下,MapDB 将利用 `Unsafe` 提供的特性来优化数据存储,比如使用更...

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

    本文将深入探讨`Unsafe`类的一些关键特性、使用方法以及它在特定场景下的应用。 1. **Unsafe API概述** - **信息相关**:`addressSize()`和`pageSize()`等方法提供了与硬件相关的内存信息。 - **对象相关**:`...

    c# winform 把彩色图片转换为灰色的图片,变灰,灰度图片,速度很快,safe,unsafe

    最简单的灰度转换方法是使用加权平均法,也称为RGB平均法。这种方法将红色、绿色和蓝色通道的值按一定的比例相加,然后除以一个常数(通常是3)来得到一个灰度值。这个比例可以是相同的,也可以根据人眼对不同颜色...

    简单谈一谈Java中的Unsafe类

    虽然官方不推荐在常规开发中使用,但`Unsafe`类在某些高性能和低延迟的应用场景中扮演着重要角色。以下是关于`Unsafe`类的一些关键知识点: 1. **内存管理**: - `allocateMemory`:动态分配内存,不需通过Java的`...

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

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

    Java为什么会引入及如何使用Unsafe

    Unsafe的`allocateInstance`方法可以直接分配一个类的实例,而不通过构造函数。 2. **修改final字段**:Java的final字段在初始化后通常是不可变的,但Unsafe允许直接修改这些字段的值,这在某些特殊情况下非常有用...

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

    由于其强大的能力,`Unsafe`类能够执行一些常规Java API无法完成的任务,但也正因为这种能力,它也可能带来安全隐患,因此不推荐在常规编程中使用。 一、内存管理 `Unsafe`类提供了内存分配、释放以及内存拷贝等...

Global site tag (gtag.js) - Google Analytics