Java中的sun.misc.Unsafe包

简介: chronicle项目:https://github.com/peter-lawrey/Java-Chronicle 这个项目是利用mmap机制来实现高效的读写数据,号称每秒写入5到20百万条数据。 作者有个测试,写入1百万条log用时0.234秒,用java自带的logger,用时7.347秒。

chronicle项目:https://github.com/peter-lawrey/Java-Chronicle

这个项目是利用mmap机制来实现高效的读写数据,号称每秒写入5到20百万条数据。

作者有个测试,写入1百万条log用时0.234秒,用java自带的logger,用时7.347秒。


在看chronicle的源代码,发现一个牛B的利用Unsafe来直接读写内存,从而提高效率的例子。

详细见这个类:https://github.com/peter-lawrey/Java-Chronicle/blob/master/src/main/java/vanilla/java/chronicle/impl/UnsafeExcerpt.java


Unsafe包的参考:http://www.docjar.com/docs/api/sun/misc/Unsafe.html

下面这个例子演示了简单的修改一个byte[]的数据。

这个例子在eclipse里不能直接编译,要到项目的属性,Java Compiler,Errors/Warnings中Forbidden reference(access rules)中设置为warning。

另外,因为sun.misc.Unsafe包不能直接使用,所有代码里用反射的技巧得到了一个Unsafe的实例。

[java]  view plain copy
  1. import java.lang.reflect.Field;  
  2. import java.util.Arrays;  
  3. import sun.misc.Unsafe;  
  4.   
  5. public class Test {  
  6.     private static int byteArrayBaseOffset;  
  7.   
  8.     public static void main(String[] args) throws SecurityException,  
  9.             NoSuchFieldException, IllegalArgumentException,  
  10.             IllegalAccessException {  
  11.         Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");  
  12.         theUnsafe.setAccessible(true);  
  13.         Unsafe UNSAFE = (Unsafe) theUnsafe.get(null);  
  14.         System.out.println(UNSAFE);  
  15.   
  16.         byte[] data = new byte[10];  
  17.         System.out.println(Arrays.toString(data));  
  18.         byteArrayBaseOffset = UNSAFE.arrayBaseOffset(byte[].class);  
  19.   
  20.         System.out.println(byteArrayBaseOffset);  
  21.         UNSAFE.putByte(data, byteArrayBaseOffset, (byte1);  
  22.         UNSAFE.putByte(data, byteArrayBaseOffset + 5, (byte5);  
  23.         System.out.println(Arrays.toString(data));  
  24.     }  
  25. }  
若转载请注明出处!若有疑问,请回复交流!
目录
相关文章
|
2月前
|
存储 安全 Java
【Java技术专题】「攻破技术盲区」攻破Java技术盲点之unsafe类的使用指南(打破Java的安全管控— sun.misc.unsafe)
【Java技术专题】「攻破技术盲区」攻破Java技术盲点之unsafe类的使用指南(打破Java的安全管控— sun.misc.unsafe)
43 0
|
Oracle Java 关系型数据库
|
Oracle Java 关系型数据库
|
2天前
|
Java 数据库
【Java多线程】对线程池的理解并模拟实现线程池
【Java多线程】对线程池的理解并模拟实现线程池
10 1
|
1天前
|
安全 Java
【JAVA进阶篇教学】第十篇:Java中线程安全、锁讲解
【JAVA进阶篇教学】第十篇:Java中线程安全、锁讲解
|
1天前
|
安全 Java
【JAVA进阶篇教学】第六篇:Java线程中状态
【JAVA进阶篇教学】第六篇:Java线程中状态
|
1天前
|
缓存 Java
【JAVA进阶篇教学】第五篇:Java多线程编程
【JAVA进阶篇教学】第五篇:Java多线程编程
|
1天前
|
Java
【JAVA基础篇教学】第十二篇:Java中多线程编程
【JAVA基础篇教学】第十二篇:Java中多线程编程
|
1天前
|
安全 Java
java-多线程学习记录
java-多线程学习记录