今天查看hadoop源代码, 发现有个Unsafe.java

稍微总结下

优势 1 减少线程调度开销, Unsafe.java 通过采用非堵塞原子方式来减少线程调度开销
        2 传统线程通信通过wait,notify方法实现(会有信号量的堵塞队列),而Unsafe使用操作系统调度命令park,unpark, 减少信号量的开销,提高新能。

差不多和windows下的InterlockedDecrement差不多的概念, 只是Unsafe的功能更加强大,可以获取的类型更多,另外可以有C/C++方式的内存分配模式以及内存交换等更多操作

Java中不直接使用Unsafe.java,封装成原子类给用户使用

  1. public class AtomicInteger extends Number implements java.io.Serializable {
  2. private static final long serialVersionUID = 6214790243416807050L;
  3.  
  4. // setup to use Unsafe.compareAndSwapInt for updates
  5. private static final Unsafe unsafe = Unsafe.getUnsafe();
  6. private static final long valueOffset;

其他还有很多类型.

附源代码

  1. /*** Eclipse Class Decompiler plugin, copyright (c) 2012 Chao Chen (cnfree2000@hotmail.com) ***/
  2. package sun.misc;
  3.  
  4. import java.lang.reflect.Field;
  5. import java.lang.reflect.Modifier;
  6. import java.security.ProtectionDomain;
  7. import sun.reflect.CallerSensitive;
  8. import sun.reflect.Reflection;
  9.  
  10. public final class Unsafe
  11. {
  12. private static final Unsafe theUnsafe;
  13. public static final int INVALID_FIELD_OFFSET = -1;
  14. public static final int ARRAY_BOOLEAN_BASE_OFFSET;
  15. public static final int ARRAY_BYTE_BASE_OFFSET;
  16. public static final int ARRAY_SHORT_BASE_OFFSET;
  17. public static final int ARRAY_CHAR_BASE_OFFSET;
  18. public static final int ARRAY_INT_BASE_OFFSET;
  19. public static final int ARRAY_LONG_BASE_OFFSET;
  20. public static final int ARRAY_FLOAT_BASE_OFFSET;
  21. public static final int ARRAY_DOUBLE_BASE_OFFSET;
  22. public static final int ARRAY_OBJECT_BASE_OFFSET;
  23. public static final int ARRAY_BOOLEAN_INDEX_SCALE;
  24. public static final int ARRAY_BYTE_INDEX_SCALE;
  25. public static final int ARRAY_SHORT_INDEX_SCALE;
  26. public static final int ARRAY_CHAR_INDEX_SCALE;
  27. public static final int ARRAY_INT_INDEX_SCALE;
  28. public static final int ARRAY_LONG_INDEX_SCALE;
  29. public static final int ARRAY_FLOAT_INDEX_SCALE;
  30. public static final int ARRAY_DOUBLE_INDEX_SCALE;
  31. public static final int ARRAY_OBJECT_INDEX_SCALE;
  32. public static final int ADDRESS_SIZE;
  33.  
  34. private static native void registerNatives();
  35.  
  36. @CallerSensitive
  37. public static Unsafe getUnsafe()
  38. {
  39. Class localClass = Reflection.getCallerClass();
  40. if (localClass.getClassLoader() != null)
  41. throw new SecurityException("Unsafe");
  42. return theUnsafe;
  43. }
  44.  
  45. public native int getInt(Object paramObject, long paramLong);
  46.  
  47. public native void putInt(Object paramObject, long paramLong, int paramInt);
  48.  
  49. public native Object getObject(Object paramObject, long paramLong);
  50.  
  51. public native void putObject(Object paramObject1, long paramLong, Object paramObject2);
  52.  
  53. public native boolean getBoolean(Object paramObject, long paramLong);
  54.  
  55. public native void putBoolean(Object paramObject, long paramLong, boolean paramBoolean);
  56.  
  57. public native byte getByte(Object paramObject, long paramLong);
  58.  
  59. public native void putByte(Object paramObject, long paramLong, byte paramByte);
  60.  
  61. public native short getShort(Object paramObject, long paramLong);
  62.  
  63. public native void putShort(Object paramObject, long paramLong, short paramShort);
  64.  
  65. public native char getChar(Object paramObject, long paramLong);
  66.  
  67. public native void putChar(Object paramObject, long paramLong, char paramChar);
  68.  
  69. public native long getLong(Object paramObject, long paramLong);
  70.  
  71. public native void putLong(Object paramObject, long paramLong1, long paramLong2);
  72.  
  73. public native float getFloat(Object paramObject, long paramLong);
  74.  
  75. public native void putFloat(Object paramObject, long paramLong, float paramFloat);
  76.  
  77. public native double getDouble(Object paramObject, long paramLong);
  78.  
  79. public native void putDouble(Object paramObject, long paramLong, double paramDouble);
  80.  
  81. @Deprecated
  82. public int getInt(Object paramObject, int paramInt)
  83. {
  84. return getInt(paramObject, paramInt);
  85. }
  86.  
  87. @Deprecated
  88. public void putInt(Object paramObject, int paramInt1, int paramInt2)
  89. {
  90. putInt(paramObject, paramInt1, paramInt2);
  91. }
  92.  
  93. @Deprecated
  94. public Object getObject(Object paramObject, int paramInt)
  95. {
  96. return getObject(paramObject, paramInt);
  97. }
  98.  
  99. @Deprecated
  100. public void putObject(Object paramObject1, int paramInt, Object paramObject2)
  101. {
  102. putObject(paramObject1, paramInt, paramObject2);
  103. }
  104.  
  105. @Deprecated
  106. public boolean getBoolean(Object paramObject, int paramInt)
  107. {
  108. return getBoolean(paramObject, paramInt);
  109. }
  110.  
  111. @Deprecated
  112. public void putBoolean(Object paramObject, int paramInt, boolean paramBoolean)
  113. {
  114. putBoolean(paramObject, paramInt, paramBoolean);
  115. }
  116.  
  117. @Deprecated
  118. public byte getByte(Object paramObject, int paramInt)
  119. {
  120. return getByte(paramObject, paramInt);
  121. }
  122.  
  123. @Deprecated
  124. public void putByte(Object paramObject, int paramInt, byte paramByte)
  125. {
  126. putByte(paramObject, paramInt, paramByte);
  127. }
  128.  
  129. @Deprecated
  130. public short getShort(Object paramObject, int paramInt)
  131. {
  132. return getShort(paramObject, paramInt);
  133. }
  134.  
  135. @Deprecated
  136. public void putShort(Object paramObject, int paramInt, short paramShort)
  137. {
  138. putShort(paramObject, paramInt, paramShort);
  139. }
  140.  
  141. @Deprecated
  142. public char getChar(Object paramObject, int paramInt)
  143. {
  144. return getChar(paramObject, paramInt);
  145. }
  146.  
  147. @Deprecated
  148. public void putChar(Object paramObject, int paramInt, char paramChar)
  149. {
  150. putChar(paramObject, paramInt, paramChar);
  151. }
  152.  
  153. @Deprecated
  154. public long getLong(Object paramObject, int paramInt)
  155. {
  156. return getLong(paramObject, paramInt);
  157. }
  158.  
  159. @Deprecated
  160. public void putLong(Object paramObject, int paramInt, long paramLong)
  161. {
  162. putLong(paramObject, paramInt, paramLong);
  163. }
  164.  
  165. @Deprecated
  166. public float getFloat(Object paramObject, int paramInt)
  167. {
  168. return getFloat(paramObject, paramInt);
  169. }
  170.  
  171. @Deprecated
  172. public void putFloat(Object paramObject, int paramInt, float paramFloat)
  173. {
  174. putFloat(paramObject, paramInt, paramFloat);
  175. }
  176.  
  177. @Deprecated
  178. public double getDouble(Object paramObject, int paramInt)
  179. {
  180. return getDouble(paramObject, paramInt);
  181. }
  182.  
  183. @Deprecated
  184. public void putDouble(Object paramObject, int paramInt, double paramDouble)
  185. {
  186. putDouble(paramObject, paramInt, paramDouble);
  187. }
  188.  
  189. public native byte getByte(long paramLong);
  190.  
  191. public native void putByte(long paramLong, byte paramByte);
  192.  
  193. public native short getShort(long paramLong);
  194.  
  195. public native void putShort(long paramLong, short paramShort);
  196.  
  197. public native char getChar(long paramLong);
  198.  
  199. public native void putChar(long paramLong, char paramChar);
  200.  
  201. public native int getInt(long paramLong);
  202.  
  203. public native void putInt(long paramLong, int paramInt);
  204.  
  205. public native long getLong(long paramLong);
  206.  
  207. public native void putLong(long paramLong1, long paramLong2);
  208.  
  209. public native float getFloat(long paramLong);
  210.  
  211. public native void putFloat(long paramLong, float paramFloat);
  212.  
  213. public native double getDouble(long paramLong);
  214.  
  215. public native void putDouble(long paramLong, double paramDouble);
  216.  
  217. public native long getAddress(long paramLong);
  218.  
  219. public native void putAddress(long paramLong1, long paramLong2);
  220.  
  221. public native long allocateMemory(long paramLong);
  222.  
  223. public native long reallocateMemory(long paramLong1, long paramLong2);
  224.  
  225. public native void setMemory(Object paramObject, long paramLong1, long paramLong2, byte paramByte);
  226.  
  227. public void setMemory(long paramLong1, long paramLong2, byte paramByte)
  228. {
  229. setMemory(null, paramLong1, paramLong2, paramByte);
  230. }
  231.  
  232. public native void copyMemory(Object paramObject1, long paramLong1, Object paramObject2, long paramLong2, long paramLong3);
  233.  
  234. public void copyMemory(long paramLong1, long paramLong2, long paramLong3)
  235. {
  236. copyMemory(null, paramLong1, null, paramLong2, paramLong3);
  237. }
  238.  
  239. public native void freeMemory(long paramLong);
  240.  
  241. @Deprecated
  242. public int fieldOffset(Field paramField)
  243. {
  244. if (Modifier.isStatic(paramField.getModifiers())) {
  245. return (int)staticFieldOffset(paramField);
  246. }
  247. return (int)objectFieldOffset(paramField);
  248. }
  249.  
  250. @Deprecated
  251. public Object staticFieldBase(Class paramClass)
  252. {
  253. Field[] arrayOfField = paramClass.getDeclaredFields();
  254. for (int i = 0; i < arrayOfField.length; ++i) {
  255. if (Modifier.isStatic(arrayOfField[i].getModifiers())) {
  256. return staticFieldBase(arrayOfField[i]);
  257. }
  258. }
  259. return null;
  260. }
  261.  
  262. public native long staticFieldOffset(Field paramField);
  263.  
  264. public native long objectFieldOffset(Field paramField);
  265.  
  266. public native Object staticFieldBase(Field paramField);
  267.  
  268. public native boolean shouldBeInitialized(Class<?> paramClass);
  269.  
  270. public native void ensureClassInitialized(Class paramClass);
  271.  
  272. public native int arrayBaseOffset(Class paramClass);
  273.  
  274. public native int arrayIndexScale(Class paramClass);
  275.  
  276. public native int addressSize();
  277.  
  278. public native int pageSize();
  279.  
  280. public native Class defineClass(String paramString, byte[] paramArrayOfByte, int paramInt1, int paramInt2, ClassLoader paramClassLoader, ProtectionDomain paramProtectionDomain);
  281.  
  282. @Deprecated
  283. @CallerSensitive
  284. public native Class defineClass(String paramString, byte[] paramArrayOfByte, int paramInt1, int paramInt2);
  285.  
  286. public native Class defineAnonymousClass(Class paramClass, byte[] paramArrayOfByte, Object[] paramArrayOfObject);
  287.  
  288. public native Object allocateInstance(Class paramClass)
  289. throws InstantiationException;
  290.  
  291. public native void monitorEnter(Object paramObject);
  292.  
  293. public native void monitorExit(Object paramObject);
  294.  
  295. public native boolean tryMonitorEnter(Object paramObject);
  296.  
  297. public native void throwException(Throwable paramThrowable);
  298.  
  299. public final native boolean compareAndSwapObject(Object paramObject1, long paramLong, Object paramObject2, Object paramObject3);
  300.  
  301. public final native boolean compareAndSwapInt(Object paramObject, long paramLong, int paramInt1, int paramInt2);
  302.  
  303. public final native boolean compareAndSwapLong(Object paramObject, long paramLong1, long paramLong2, long paramLong3);
  304.  
  305. public native Object getObjectVolatile(Object paramObject, long paramLong);
  306.  
  307. public native void putObjectVolatile(Object paramObject1, long paramLong, Object paramObject2);
  308.  
  309. public native int getIntVolatile(Object paramObject, long paramLong);
  310.  
  311. public native void putIntVolatile(Object paramObject, long paramLong, int paramInt);
  312.  
  313. public native boolean getBooleanVolatile(Object paramObject, long paramLong);
  314.  
  315. public native void putBooleanVolatile(Object paramObject, long paramLong, boolean paramBoolean);
  316.  
  317. public native byte getByteVolatile(Object paramObject, long paramLong);
  318.  
  319. public native void putByteVolatile(Object paramObject, long paramLong, byte paramByte);
  320.  
  321. public native short getShortVolatile(Object paramObject, long paramLong);
  322.  
  323. public native void putShortVolatile(Object paramObject, long paramLong, short paramShort);
  324.  
  325. public native char getCharVolatile(Object paramObject, long paramLong);
  326.  
  327. public native void putCharVolatile(Object paramObject, long paramLong, char paramChar);
  328.  
  329. public native long getLongVolatile(Object paramObject, long paramLong);
  330.  
  331. public native void putLongVolatile(Object paramObject, long paramLong1, long paramLong2);
  332.  
  333. public native float getFloatVolatile(Object paramObject, long paramLong);
  334.  
  335. public native void putFloatVolatile(Object paramObject, long paramLong, float paramFloat);
  336.  
  337. public native double getDoubleVolatile(Object paramObject, long paramLong);
  338.  
  339. public native void putDoubleVolatile(Object paramObject, long paramLong, double paramDouble);
  340.  
  341. public native void putOrderedObject(Object paramObject1, long paramLong, Object paramObject2);
  342.  
  343. public native void putOrderedInt(Object paramObject, long paramLong, int paramInt);
  344.  
  345. public native void putOrderedLong(Object paramObject, long paramLong1, long paramLong2);
  346.  
  347. public native void unpark(Object paramObject);
  348.  
  349. public native void park(boolean paramBoolean, long paramLong);
  350.  
  351. public native int getLoadAverage(double[] paramArrayOfDouble, int paramInt);
  352.  
  353. static
  354. {
  355. registerNatives();
  356. Reflection.registerMethodsToFilter(Unsafe.class, new String[] { "getUnsafe" });
  357.  
  358. theUnsafe = new Unsafe();
  359.  
  360. ARRAY_BOOLEAN_BASE_OFFSET = theUnsafe.arrayBaseOffset([Z.class);
  361.  
  362. ARRAY_BYTE_BASE_OFFSET = theUnsafe.arrayBaseOffset([B.class);
  363.  
  364. ARRAY_SHORT_BASE_OFFSET = theUnsafe.arrayBaseOffset([S.class);
  365.  
  366. ARRAY_CHAR_BASE_OFFSET = theUnsafe.arrayBaseOffset([C.class);
  367.  
  368. ARRAY_INT_BASE_OFFSET = theUnsafe.arrayBaseOffset([I.class);
  369.  
  370. ARRAY_LONG_BASE_OFFSET = theUnsafe.arrayBaseOffset([J.class);
  371.  
  372. ARRAY_FLOAT_BASE_OFFSET = theUnsafe.arrayBaseOffset([F.class);
  373.  
  374. ARRAY_DOUBLE_BASE_OFFSET = theUnsafe.arrayBaseOffset([D.class);
  375.  
  376. ARRAY_OBJECT_BASE_OFFSET = theUnsafe.arrayBaseOffset([Ljava.lang.Object.class);
  377.  
  378. ARRAY_BOOLEAN_INDEX_SCALE = theUnsafe.arrayIndexScale([Z.class);
  379.  
  380. ARRAY_BYTE_INDEX_SCALE = theUnsafe.arrayIndexScale([B.class);
  381.  
  382. ARRAY_SHORT_INDEX_SCALE = theUnsafe.arrayIndexScale([S.class);
  383.  
  384. ARRAY_CHAR_INDEX_SCALE = theUnsafe.arrayIndexScale([C.class);
  385.  
  386. ARRAY_INT_INDEX_SCALE = theUnsafe.arrayIndexScale([I.class);
  387.  
  388. ARRAY_LONG_INDEX_SCALE = theUnsafe.arrayIndexScale([J.class);
  389.  
  390. ARRAY_FLOAT_INDEX_SCALE = theUnsafe.arrayIndexScale([F.class);
  391.  
  392. ARRAY_DOUBLE_INDEX_SCALE = theUnsafe.arrayIndexScale([D.class);
  393.  
  394. ARRAY_OBJECT_INDEX_SCALE = theUnsafe.arrayIndexScale([Ljava.lang.Object.class);
  395.  
  396. ADDRESS_SIZE = theUnsafe.addressSize();
  397. }
  398. }

hadoop中使用的Unsafe.java的更多相关文章

  1. hadoop中Text类 与 java中String类的区别

    hadoop 中 的Text类与java中的String类感觉上用法是相似的,但两者在编码格式和访问方式上还是有些差别的,要说明这个问题,首先得了解几个概念: 字符集: 是一个系统支持的所有抽象字符的 ...

  2. Hadoop中java.lang.ClassCastException: partition解决方法

    java.lang.ClassCastException: partition.KpiWritable cannot be cast to org.apache.hadoop.io.LongWrita ...

  3. hadoop中实现java网络爬虫

    这一篇网络爬虫的实现就要联系上大数据了.在前两篇java实现网络爬虫和heritrix实现网络爬虫的基础上,这一次是要完整的做一次数据的收集.数据上传.数据分析.数据结果读取.数据可视化. 需要用到 ...

  4. Hadoop中RPC协议小例子报错java.lang.reflect.UndeclaredThrowableException解决方法

    最近在学习传智播客吴超老师的Hadoop视频,里面他在讲解RPC通信原理的过程中给了一个RPC的小例子,但是自己编写的过程中遇到一个小错误,整理如下: log4j:WARN No appenders ...

  5. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  6. Hadoop中MR程序的几种提交运行模式

    本地模型运行 1:在windows的eclipse里面直接运行main方法,就会将job提交给本地执行器localjobrunner执行       ----输入输出数据可以放在本地路径下(c:/wc ...

  7. hadoop中遇到的一些问题

    1.验证词统计程序.----无法加载本地库 出现错误: WARN util.NativeCodeLoader: Unable to load native-hadoop library for you ...

  8. Hadoop中客户端和服务器端的方法调用过程

    1.Java动态代理实例 Java 动态代理一个简单的demo:(用以对比Hadoop中的动态代理) Hello接口: public interface Hello { void sayHello(S ...

  9. Hadoop中WritableComparable 和 comparator

    1.WritableComparable 查看HadoopAPI,如图所示: WritableComparable继承自Writable和java.lang.Comparable接口,是一个Writa ...

随机推荐

  1. c++中代理类的学习

    https://blog.csdn.net/lcg910978041/article/details/51468680 C++代理类是为了解决这样的问题: 容器通常只能包含一种类型的对象,所以很难在容 ...

  2. python 矢量化的字符串

  3. #1413 : Rikka with String 后缀自动机 + 二级差分

    http://hihocoder.com/problemset/problem/1413?sid=1199641 这题断断续续做了2个多星期吧,一直不会 设总答案为sum,替换后新加的子串数量为x,失 ...

  4. (转) tcpdump参数解析及使用详解

    tcpdump介绍 原文:http://blog.csdn.net/hzhsan/article/details/43445787 tcpdump 是一个运行在命令行下的抓包工具.它允许用户拦截和显示 ...

  5. telnet不能用,提示:-bash: telnet: command not found

    1.[root@localhost ~]# telnet  bash: telnet: command not found 2. 查询了是否安装Telnet包,结果如下: [root@localhos ...

  6. keepalived双机热备实现故障时发送邮件通知

    目前项目已经采用nginx来实现负载均衡,但是nginx调度器只有一台,上次还意外的down机一次,导致整个服务应用全部瘫痪,这次准备再加一个调度器来实现站点高可用性,也就是常说的双机热备了. mas ...

  7. c#实体转化

    经常会遇到把一个实体转化成另一个实体这样的情况,实体的属性一个一个手写去转化不反对,但不是啥好的方法:可以使用反射写一个通用的实体转化类,针对任何实体转化,不用再去自己手写. public stati ...

  8. IDEA配置 tomcat server

  9. 什么是css sprites,如何使用?

    css sprites:精灵图(雪碧图):把一堆小图片整合在一张大图上,通过背景图片相关设置(背景图片.背景图是否重复.背景图定位),显示图片,减轻服务器对图片的请求数量 优点: 1.减少网页的HTT ...

  10. ansible软件相关模块丶计划任务,剧本

    软件相关模块 yum rpm 和yum 的区别 rpm:redhat package manager yum可以解决依赖关系 yum 源配置 [epel] name=Extra Packages fo ...