Unsafe|Unsafe 类源码

packagecom.ysj.spring.transaction;
importjava.lang.reflect.Field;
/**
* 这个类提供了一个更底层的操作并且应该在受信任的代码中使用。可以通过内存地址
* 存取fields,如果给出的内存地址是无效的那么会有一个不确定的运行表现。
*
CAS皆为原子操作!
*/
publicclassUnsafe {
// Singleton class.
privatestaticUnsafe unsafe=newUnsafe();


/**
* Private default constructor to prevent creation of an arbitrary
* number of instances.
* 使用私有默认构造器防止创建多个实例
*/
privateUnsafe() {
}


/**
* 获取Unsafe的单例,这个方法调用应该防止在不可信的代码中实例,
【Unsafe|Unsafe 类源码】* 因为unsafe类提供了一个低级别的操作,例如直接内存存取。
*/
publicstaticUnsafe getUnsafe() {
SecurityManagersm= System.getSecurityManager();
if(sm!=null)
sm.checkPropertiesAccess();
returnunsafe;
}


/**
* 返回指定静态field的内存地址偏移量,在这个类的其他方法中这个值只是被用作一个访问
* 特定field的一个方式。这个值对于 给定的field是唯一的,并且后续对该方法的调用都应该
* 返回相同的值。
*
*@param需要返回偏移量的field
*@return指定field的偏移量
*/
publicnativelongobjectFieldOffset(Fieldfield);


/**
* 在obj的offset位置比较integer field和期望的值,如果相同则更新。这个方法
* 的操作应该是原子的,因此提供了一种不可中断的方式更新integer field。
*
*@paramobj包含要修改field的对象
*@paramoffsetobj中整型field的偏移量
*@paramexpect 希望field中存在的值
*@paramupdate 如果期望值expect与field的当前值相同,设置filed的值为这个新值
*@returntrue是否field的值被更改
*/
publicnativebooleancompareAndSwapInt(Objectobj,longoffset,
intexpect,intupdate);


/**
* 在obj的offset位置比较long field和期望的值,如果相同则更新。这个方法
* 的操作应该是原子的,因此提供了一种不可中断的方式更新long field。
*
*@paramobj包含要修改field的对象
*@paramoffsetobj中long型field的偏移量
*@paramexpect 希望field中存在的值
*@paramupdate 如果期望值expect与field的当前值相同,设置filed的值为这个新值
*@returntrue是否field的值被更改
*/
publicnativebooleancompareAndSwapLong(Objectobj,longoffset,
longexpect,longupdate);


/**
* 在obj的offset位置比较object field和期望的值,如果相同则更新。这个方法
* 的操作应该是原子的,因此提供了一种不可中断的方式更新object field。
*
*@paramobj包含要修改field的对象
*@paramoffsetobj中object型field的偏移量
*@paramexpect 希望field中存在的值
*@paramupdate 如果期望值expect与field的当前值相同,设置filed的值为这个新值
*@returntrue是否field的值被更改
*/
publicnativebooleancompareAndSwapObject(Objectobj,longoffset,
Objectexpect, Objectupdate);


/**
* 设置obj对象中offset偏移地址对应的整型field的值为指定值。这是一个有序或者
* 有延迟的putIntVolatile方法,并且不保证值的改变被其他线程立
* 即看到。只有在field被volatile修饰并且期望被意外修改的时候
* 使用才有用。
*
*@paramobj包含需要修改field的对象
*@paramoffsetobj中整型field的偏移量
*@paramvaluefield将被设置的新值
*@see#putIntVolatile(Object, long, int)
*/
publicnativevoidputOrderedInt(Objectobj,longoffset,intvalue);


/**
* 设置obj对象中offset偏移地址对应的long型field的值为指定值。这是一个有序或者
* 有延迟的putLongVolatile方法,并且不保证值的改变被其他线程立
* 即看到。只有在field被volatile修饰并且期望被意外修改的时候
* 使用才有用。
*
*@paramobj包含需要修改field的对象
*@paramoffsetobj中long型field的偏移量
*@paramvaluefield将被设置的新值
*@see#putLongVolatile(Object, long, long)
*/
publicnativevoidputOrderedLong(Objectobj,longoffset,longvalue);


/**
* 设置obj对象中offset偏移地址对应的object型field的值为指定值。这是一个有序或者
* 有延迟的putObjectVolatile方法,并且不保证值的改变被其他线程立
* 即看到。只有在field被volatile修饰并且期望被意外修改的时候
* 使用才有用。
*
*@paramobj包含需要修改field的对象
*@paramoffsetobj中long型field的偏移量
*@paramvaluefield将被设置的新值
*/
publicnativevoidputOrderedObject(Objectobj,longoffset, Objectvalue);


/**
* 设置obj对象中offset偏移地址对应的整型field的值为指定值。支持volatile store语义
*
*@paramobj包含需要修改field的对象
*@paramoffsetobj中整型field的偏移量
*@paramvaluefield将被设置的新值
*/
publicnativevoidputIntVolatile(Objectobj,longoffset,intvalue);


/**
* 获取obj对象中offset偏移地址对应的整型field的值,支持volatile load语义。
*
*@paramobj包含需要去读取的field的对象
*@paramoffsetobj中整型field的偏移量
*/
publicnativeintgetIntVolatile(Objectobj,longoffset);


/**
* 设置obj对象中offset偏移地址对应的long型field的值为指定值。支持volatile store语义
*
*@paramobj包含需要修改field的对象
*@paramoffsetobj中long型field的偏移量
*@paramvaluefield将被设置的新值
*@see#putLong(Object, long, long)
*/
publicnativevoidputLongVolatile(Objectobj,longoffset,longvalue);


/**
* 设置obj对象中offset偏移地址对应的long型field的值为指定值。
*
*@paramobj包含需要修改field的对象
*@paramoffsetobj中long型field的偏移量
*@paramvaluefield将被设置的新值
*@see#putLongVolatile(Object, long, long)
*/
publicnativevoidputLong(Objectobj,longoffset,longvalue);


/**
* 获取obj对象中offset偏移地址对应的long型field的值,支持volatile load语义。
*
*@paramobj包含需要去读取的field的对象
*@paramoffsetobj中long型field的偏移量
*@see#getLong(Object, long)
*/
publicnativelonggetLongVolatile(Objectobj,longoffset);


/**
* 获取obj对象中offset偏移地址对应的long型field的值
*
*@paramobj包含需要去读取的field的对象
*@paramoffsetobj中long型field的偏移量
*@see#getLongVolatile(Object, long)
*/
publicnativelonggetLong(Objectobj,longoffset);


/**
* 设置obj对象中offset偏移地址对应的object型field的值为指定值。支持volatile store语义
*
*@paramobj包含需要修改field的对象
*@paramoffsetobj中object型field的偏移量
*@paramvaluefield将被设置的新值
*@see#putObject(Object, long, Object)
*/
publicnativevoidputObjectVolatile(Objectobj,longoffset, Objectvalue);


/**
* 设置obj对象中offset偏移地址对应的object型field的值为指定值。
*
*@paramobj包含需要修改field的对象
*@paramoffsetobj中object型field的偏移量
*@paramvaluefield将被设置的新值
*@see#putObjectVolatile(Object, long, Object)
*/
publicnativevoidputObject(Objectobj,longoffset, Objectvalue);


/**
* 获取obj对象中offset偏移地址对应的object型field的值,支持volatile load语义。
*
*@paramobj包含需要去读取的field的对象
*@paramoffsetobj中object型field的偏移量
*/
publicnativeObject getObjectVolatile(Objectobj,longoffset);


/**
* 获取给定数组中第一个元素的偏移地址。
* 为了存取数组中的元素,这个偏移地址与arrayIndexScale
*方法的非0返回值一起被使用。
*
*@paramarrayClass the class for which the first element's address should
*be obtained.
*第一个元素地址被获取的class
*@returnthe offset of the first element of the array class.
*数组第一个元素 的偏移地址
*@seearrayIndexScale(Class)
*/
publicnativeintarrayBaseOffset(@SuppressWarnings("rawtypes") ClassarrayClass);


/**
* 获取用户给定数组寻址的换算因子.一个合适的换算因子不能返回的时候(例如:基本类型),
* 返回0.这个返回值能够与arrayBaseOffset
*一起使用去存取这个数组class中的元素
*
*@paramarrayClass the class whose scale factor should be returned.
*@returnthe scale factor, or zero if not supported for this array class.
*/
publicnativeintarrayIndexScale(@SuppressWarnings("rawtypes") ClassarrayClass);


/**
* 释放被park创建的在一个线程上的阻塞.这个
* 方法也可以被使用来终止一个先前调用park导致的阻塞.
* 这个操作操作时不安全的,因此线程必须保证是活的.这是java代码不是native代码。
*
*@paramthread the thread to unblock.
*要解除阻塞的线程
*/
publicnativevoidunpark(Threadthread);


/**
* 阻塞一个线程直到unpark出现、线程被中断或者timeout时间到期。如果一个unpark调用已经出现了,
* 这里只计数。timeout为0表示永不过期.当isAbsolute为true时,
* timeout是相对于新纪元之后的毫秒。否则这个值就是超时前的纳秒数。这个方法执行时
* 也可能不合理地返回(没有具体原因)
*
*@paramisAbsolute 如果为true timeout的值是一个相对于新纪元之后的毫秒数
*@paramtime可以是一个要等待的纳秒数,或者是一个相对于新纪元之后的毫秒数直到
*到达这个时间点
*/
public native void park(boolean isAbsolute, long time);
}

    推荐阅读