Unsafe 简介

Unsafe 是sun.misc包中的一个类,可以通过内存偏移量操作类变量/成员变量

Unsafe 用途

AQS(AbstractQueuedSynchronizer) 常用作实现轻量级锁,它里面有一个双向链表,用于封装未抢到锁的线程 ,其中有用到UnsafecompareAndSwapObject修改链表

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 的简单使用的更多相关文章

  1. sun.misc.Unsafe 详解

    原文地址 译者:许巧辉 校对:梁海舰 Java是一门安全的编程语言,防止程序员犯很多愚蠢的错误,它们大部分是基于内存管理的.但是,有一种方式可以有意的执行一些不安全.容易犯错的操作,那就是使用Unsa ...

  2. CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator

    CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator 我还没有用过Compute Shader,所以现在把红宝书里的例子拿来了,加入CSharpGL中. ...

  3. unsafe

    今天无意中发现C#这种完全面向对象的高级语言中也可以用不安全的指针类型,即要用到unsafe关键字.在公共语言运行库 (CLR) 中,不安全代码是指无法验证的代码.C# 中的不安全代码不一定是危险的, ...

  4. C#+无unsafe的非托管大数组(large unmanaged array in c# without 'unsafe' keyword)

    C#+无unsafe的非托管大数组(large unmanaged array in c# without 'unsafe' keyword) +BIT祝威+悄悄在此留下版了个权的信息说: C#申请一 ...

  5. CSharpGL(1)从最简单的例子开始使用CSharpGL

    CSharpGL(1)从最简单的例子开始使用CSharpGL 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo ...

  6. sun.misc.Unsafe的理解

    以下sun.misc.Unsafe源码和demo基于jdk1.7: 最近在看J.U.C里的源码,很多都用到了sun.misc.Unsafe这个类,一知半解,看起来总感觉有点不尽兴,所以打算对Unsaf ...

  7. 基于Simple Image Statistics(简单图像统计,SIS)的图像二值化算法。

    这是个简单的算法,是全局二值算法的一种,算法执行速度快. 算法过程简单描述如下: 对于每一个像素,做如下处理 1.计算当前像素水平和垂直方向的梯度. (two gradients are calcul ...

  8. 一个简单的统计图像主颜色的算法(C#源代码)

    前段日子有朋友咨询了下分析图像主颜色的算法,我对这一块也没有什么深入的研究,参考了一些小代码,然后自己写了一个很简单的小工具,现共享给大家. 界面截图如下: 算法的原理很简单,就是统计出图像中各种颜色 ...

  9. Unsafe与CAS

    Unsafe 简单讲一下这个类.Java无法直接访问底层操作系统,而是通过本地(native)方法来访问.不过尽管如此,JVM还是开了一个后门,JDK中有一个类Unsafe,它提供了硬件级别的原子操作 ...

随机推荐

  1. 有关CSS的overflow和border-radius的那些事,你的圆角被覆盖了吗?

    事件起因 最初是网友的一个提问,来自于我的知识星球社区: 说实话,不得不佩服这个网友的眼力,这么小的细节都能发现.不过这也正是 FineUI 一直前进的动力,来自社区的监督和促进. 从截图上看,貌似圆 ...

  2. 我对DFS的理解

    我对DFS的理解 [何为DFS] 深度优先搜索(Depth-First-Search),简称DFS.是一种常见搜索算法.其方法是从原点不断一条路扩散,当无路可走时回退来走下一条路,直至找到目标或遍历. ...

  3. 详解WTL应用向导

    之前向 VS2019 中添加了 WTL 应用向导,今天来分析下该应用向导安装的相关文件,最终达到拷贝相关文件到 VS2019 的相应目录中即可直接使用 WTL 应用向导的目的. 在 VS2017 之前 ...

  4. 通俗理解ZooKeeper是如何保证数据一致性的

    https://blog.csdn.net/liuhaiabc/article/details/70771322 https://blog.csdn.net/zhaoyangjian724/artic ...

  5. ExcelPower_Helper插件下载与更新日志

    ExcelPower_Helper插件下载.功能简述与演示 ExcelPower_Helper最新版本为:0.4.5,截止到目前为止. 下载地址: 链接:https://pan.baidu.com/s ...

  6. javascript深入浅出——学习笔记(包装对象和类型检测)

    3包装对象:https://www.imooc.com/video/5676 当我们尝试把基本类型已对象的方式访问时,javascript会把该基本类型转换为对应的包装类型对象(临时对象),相当于ne ...

  7. window.open() & iframe & tab

    window.open() & iframe & tab window.open() open pages in the same window / tab https://stack ...

  8. java篇 之 流程控制语句

    条件判断语句 条件语句: If(boolean类型) {} else {}    (打大括号避免出错) switch (export)语句:export的类型必须是 byte,short,char,i ...

  9. Error:Failed to resolve: com.android.support.constraint:constraint-layout:1.0.2

    可以换个maven库: allprojects { repositories { jcenter() //maven { url "https://jitpack.io" } ma ...

  10. P1140 相似基因 (dp)

    题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类基因工作组的任务 ...