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. python3.4中自定义数组类(即重写数组类)

    '''自定义数组类,实现数组中数字之间的四则运算,内积运算,大小比较,数组元素访问修改及成员测试等功能''' class MyArray: '''保证输入值为数字元素(整型,浮点型,复数)''' de ...

  2. 利用eval函数实现简单的计算器

    """ description : use python eval() function implement a simple calculator functions ...

  3. Java数据库学习之分页查询

    分页查询  limit [start],[rows] 思路: pram start 从哪一行开始 关键是从哪一行开始,需要根据查询的页数来进行换算出查询具体页数是从哪一行开始 start = (pag ...

  4. python监控机器(第1版)

    # coding:utf-8 import configparser import logging import os import psutil import ctypes import platf ...

  5. JS学习笔记:(三)JS执行机制

    首先我们先明确一点:JavaScript是一门单线程语言.单线程也就是说同一时间只能执行一个任务,所有的任务都必须排队顺序执行.那么如果一个任务耗时很长,阻塞了其它任务的执行,就会给用户造成不友好的体 ...

  6. Linux(Ubuntu)使用日记------Mongodb的安装与使用

    1.安装 Linux下安装mongodb还是比较容易的 直接使用apt-get安装即可,命令如下: sudo apt-get install mongodb 安装完成之后进行检验, “mongo sh ...

  7. plus.webview更新上一个页面的信息

    let currentWebview = plus.webview.currentWebview();       let backWebview = currentWebview.opener(); ...

  8. XPath、CSS 选择器 -学习地址

    http://www.w3school.com.cn/cssref/css_selectors.asp http://www.w3school.com.cn/xpath/xpath_syntax.as ...

  9. 迁移git

    转自:https://www.darrenfang.com/2016/03/transferring-a-repository/ 因为更换服务器,需要将原来的 git 项目迁移到新的服务器上,需要保留 ...

  10. HDU 2586 How far way?

    传送门 继续水板子题... #include <bits/stdc++.h> using namespace std; inline int read() { , f = ; char c ...