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类提供了一个低级别的操作,例如直接内存存取。

     */

    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的偏移量

     *@paramvalue  field将被设置的新值

     *@see#putIntVolatile(Object, long, int)

     */

    publicnativevoidputOrderedInt(Objectobj,longoffset,intvalue);


    /**

     * 设置obj对象中offset偏移地址对应的long型field的值为指定值。这是一个有序或者

     * 有延迟的putLongVolatile方法,并且不保证值的改变被其他线程立

     * 即看到。只有在field被volatile修饰并且期望被意外修改的时候

     * 使用才有用。

     *

     *@paramobj    包含需要修改field的对象

     *@paramoffsetobj中long型field的偏移量

     *@paramvalue  field将被设置的新值

     *@see#putLongVolatile(Object, long, long)

     */

    publicnativevoidputOrderedLong(Objectobj,longoffset,longvalue);


    /**

     * 设置obj对象中offset偏移地址对应的object型field的值为指定值。这是一个有序或者

     * 有延迟的putObjectVolatile方法,并且不保证值的改变被其他线程立

     * 即看到。只有在field被volatile修饰并且期望被意外修改的时候

     * 使用才有用。

     *

     *@paramobj    包含需要修改field的对象

     *@paramoffsetobj中long型field的偏移量

     *@paramvalue  field将被设置的新值

     */

    publicnativevoidputOrderedObject(Objectobj,longoffset, Objectvalue);


    /**

     * 设置obj对象中offset偏移地址对应的整型field的值为指定值。支持volatile store语义

     *

     *@paramobj    包含需要修改field的对象

     *@paramoffsetobj中整型field的偏移量

     *@paramvalue  field将被设置的新值

     */

    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的偏移量

     *@paramvalue  field将被设置的新值

     *@see#putLong(Object, long, long)

     */

    publicnativevoidputLongVolatile(Objectobj,longoffset,longvalue);


    /**

     * 设置obj对象中offset偏移地址对应的long型field的值为指定值。

     *

     *@paramobj    包含需要修改field的对象

     *@paramoffsetobj中long型field的偏移量

     *@paramvalue  field将被设置的新值

     *@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的偏移量

     *@paramvalue  field将被设置的新值

     *@see#putObject(Object, long, Object)

     */

    publicnativevoidputObjectVolatile(Objectobj,longoffset, Objectvalue);


    /**

     * 设置obj对象中offset偏移地址对应的object型field的值为指定值。

     *

     *@paramobj    包含需要修改field的对象

     *@paramoffsetobj中object型field的偏移量

     *@paramvalue  field将被设置的新值

     *@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);

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容