Unsafe 的简单使用
Unsafe 简介
Unsafe 是sun.misc包中的一个类,可以通过内存偏移量操作类变量/成员变量
Unsafe 用途
AQS(AbstractQueuedSynchronizer) 常用作实现轻量级锁,它里面有一个双向链表,用于封装未抢到锁的线程 ,其中有用到
Unsafe的compareAndSwapObject修改链表
Unsafe 简单使用示例
package com.xh.kssfwjg.idgenerator;
import sun.misc.Unsafe;
import java.lang.reflect.Field;
/**
 * TODO
 *
 * @auther xh
 * @date 12/26/18 6:11 PM
 */
public class UnSaveTest {
    private static final Unsafe unsafe = getUnsafe();
    private static final long objectNameOffset;
    private static final long staticNameOffset;
    private static String staticName = "qq";
    private String objectName = "123";
    static {
        try {
            objectNameOffset = unsafe.objectFieldOffset
                    (UnSaveTest.class.getDeclaredField("objectName"));
            staticNameOffset = unsafe.staticFieldOffset(UnSaveTest.class.getDeclaredField("staticName"));
        } catch (NoSuchFieldException e) {
            throw new Error(e);
        }
    }
    public static void main(String[] args) {
        UnSaveTest unSaveTest = new UnSaveTest();
        // unsafe.compareAndSwapObject(unSaveTest, testOffset, "123", "456");//CAS
        unsafe.putObject(unSaveTest, objectNameOffset, "haha");//直接修改
        unsafe.putObject(UnSaveTest.class, staticNameOffset, "hehe");//直接修改
        System.out.println(unSaveTest.objectName);
        System.out.println(UnSaveTest.staticName);
    }
    private static Unsafe getUnsafe() {
        Field singleoneInstanceField = null;
        try {
            singleoneInstanceField = Unsafe.class.getDeclaredField("theUnsafe");
            singleoneInstanceField.setAccessible(true);
            return (Unsafe) singleoneInstanceField.get(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
output:
haha
hehe
ps:
如果变量使用
final修饰,如:
private static final String staticName = "qq";
private final String objectName = "123";
是不能修改的.
另外附上反射的示例
        try {
            Class clazz = Class.forName("com.xh.kssfwjg.idgenerator.UnSaveTest");
            Object o = clazz.newInstance();
            Field object_field_name = clazz.getDeclaredField("objectName");
            object_field_name.setAccessible(true);
            object_field_name.set(o, "ooo");
            Field static_field_name = clazz.getDeclaredField("staticName");
            static_field_name.setAccessible(true);
            static_field_name.set(clazz, "ppp");
            System.out.println(UnSaveTest.staticName);
            System.out.println(((UnSaveTest) o).objectName);
        } catch (Exception e) {
            e.printStackTrace();
        }
结果一样
Unsafe 的简单使用的更多相关文章
- sun.misc.Unsafe 详解
		原文地址 译者:许巧辉 校对:梁海舰 Java是一门安全的编程语言,防止程序员犯很多愚蠢的错误,它们大部分是基于内存管理的.但是,有一种方式可以有意的执行一些不安全.容易犯错的操作,那就是使用Unsa ... 
- CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator
		CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator 我还没有用过Compute Shader,所以现在把红宝书里的例子拿来了,加入CSharpGL中. ... 
- unsafe
		今天无意中发现C#这种完全面向对象的高级语言中也可以用不安全的指针类型,即要用到unsafe关键字.在公共语言运行库 (CLR) 中,不安全代码是指无法验证的代码.C# 中的不安全代码不一定是危险的, ... 
- C#+无unsafe的非托管大数组(large unmanaged array in c# without 'unsafe' keyword)
		C#+无unsafe的非托管大数组(large unmanaged array in c# without 'unsafe' keyword) +BIT祝威+悄悄在此留下版了个权的信息说: C#申请一 ... 
- CSharpGL(1)从最简单的例子开始使用CSharpGL
		CSharpGL(1)从最简单的例子开始使用CSharpGL 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo ... 
- sun.misc.Unsafe的理解
		以下sun.misc.Unsafe源码和demo基于jdk1.7: 最近在看J.U.C里的源码,很多都用到了sun.misc.Unsafe这个类,一知半解,看起来总感觉有点不尽兴,所以打算对Unsaf ... 
- 基于Simple Image Statistics(简单图像统计,SIS)的图像二值化算法。
		这是个简单的算法,是全局二值算法的一种,算法执行速度快. 算法过程简单描述如下: 对于每一个像素,做如下处理 1.计算当前像素水平和垂直方向的梯度. (two gradients are calcul ... 
- 一个简单的统计图像主颜色的算法(C#源代码)
		前段日子有朋友咨询了下分析图像主颜色的算法,我对这一块也没有什么深入的研究,参考了一些小代码,然后自己写了一个很简单的小工具,现共享给大家. 界面截图如下: 算法的原理很简单,就是统计出图像中各种颜色 ... 
- Unsafe与CAS
		Unsafe 简单讲一下这个类.Java无法直接访问底层操作系统,而是通过本地(native)方法来访问.不过尽管如此,JVM还是开了一个后门,JDK中有一个类Unsafe,它提供了硬件级别的原子操作 ... 
随机推荐
- 10 Django RESTful api 实现匿名访问
			# views_send_code.py from rest_framework.permissions import AllowAny class MsgCodeViewSet(CreateMode ... 
- numpy科学计算库的基础用法,完美抽象多维数组(原创)
			#起别名避免重名 import numpy as np #小技巧:print从外往内看==shape从左往右看 if __name__ == "__main__": print(' ... 
- [题解]玩具谜题(toy)
			玩具谜题(toy) 来源:noip2016 提高组 day1 [题目描述] 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个 ... 
- C#之委托与事件(转载)
			委托 1. 委托是事件的基础,使用关键字delegate,通过委托与命名方法或匿名方法关联,可以实现委托的实例化.必须使用具有兼容返回类型和输入参数的方法或 lambda 表达式实例化委托. pri ... 
- Ubuntu常用软件
			//latex公式识别 sudo snap install mathpix-snipping-tool //markdown # or run: # sudo apt-key adv --keyser ... 
- stream流操作List工具类
			工作中操作List对于程序猿来说是"基本操作",为了更加便利,对JDK8的新特性stream流进行二次封装.话不多说,直接上代码 package com.mydemo; impor ... 
- 结巴分词出现AttributeError: 'float' object has no attribute 'decode'错误
			将data转变为str格式 inputfile = 'comment2.csv'outputfile = 'comment2_cut.txt'datas = pd.read_csv(inputfile ... 
- NSParagraphStyle 的属性
			UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 20, 20)]; label.font = [UIFont sys ... 
- Day 1 上午
			唉,上午就碰到一个开不了机的电脑,白白浪费了半个小时,真的难受QwQ POINT1 枚举 枚举也称作穷举,指的是从问题所有可能的解的集合中一一枚举各元素. 用题目中给定的检验条件判定哪些是无用的,哪些 ... 
- [SCOI2009]生日礼物题解
			题目 一道模拟和队列题,但模拟比队列的成分多一些.队列也就是用两个指针模拟的. 可以用枚举的思想.首先我们知道r(即区间的右端点是肯定不会左移的),而l右移的同时,r可能不变,也可能右移,所以这样就可 ... 
