[关闭]
@aloxc 2018-06-29T10:21:43.000000Z 字数 1492 阅读 434

我们一起学ignite之“指针” GridUnSafe及它实现的几个锁

一起学 ignite 源码分析 高并发


如题,ignite中,有一些地方使用到了java中的“指针”,注意这个所谓的指针式加了双引号的,为什么?因为java中根本没有指针,也就是无法直接使用命令修改指针地址所保存的数据。但是java中有个Unsafe类,这个类中有很多的本地方法,这些方法是使用c实现,借助c,java实现了指针操作。
Unsafe.java中部分代码,

  1. public native int getInt(Object var1, long var2);
  2. public native void putInt(Object var1, long var2, int var4);
  3. public native Object getObject(Object var1, long var2);
  4. public native void putObject(Object var1, long var2, Object var4);
  5. public native boolean getBoolean(Object var1, long var2);
  6. public native void putBoolean(Object var1, long var2, boolean var4);
  7. public native byte getByte(Object var1, long var2);
  8. public native void putByte(Object var1, long var2, byte var4);
  9. public native short getShort(Object var1, long var2);
  10. public native void putShort(Object var1, long var2, short var4);
  11. public native char getChar(Object var1, long var2);
  12. public native void putChar(Object var1, long var2, char var4);
  13. public native long getLong(Object var1, long var2);
  14. public native void putLong(Object var1, long var2, long var4);

在ignite有一个Unsafe的封装类,GridUnsafe,本类封装了jdk中的unsafe操作,如下面部分代码

  1. /**
  2. * Gets integer value from object field.
  3. *
  4. * @param obj Object.
  5. * @param fieldOff Field offset.
  6. * @return Integer value from object field.
  7. */
  8. public static int getIntField(Object obj, long fieldOff) {
  9. return UNSAFE.getInt(obj, fieldOff);
  10. }
  11. /**
  12. * Stores integer value into object field.
  13. *
  14. * @param obj Object.
  15. * @param fieldOff Field offset.
  16. * @param val Value.
  17. */
  18. public static void putIntField(Object obj, long fieldOff, int val) {
  19. UNSAFE.putInt(obj, fieldOff, val);
  20. }

说了这些,我们再来分析下ignite的几个锁

1.GridSpinReadWriteLock 一个自旋读写非公平锁,该锁会一直偏向写线程,待取得锁的所有线程中,只要有写线程,那么其它读线程只能等待所有写线程完毕后才能执行。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注