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,它提供了硬件级别的原子操作 ...
随机推荐
- 云计算openstack共享组件(1)——时间同步服务ntp
一.标准时间讲解 地球分为东西十二个区域,共计 24 个时区 格林威治作为全球标准时间即 (GMT 时间 ),东时区以格林威治时区进行加,而西时区则为减. 地球的轨道并非正圆,在加上自转速度逐年递减, ...
- dede织梦 arclist标签完美支持currentstyle属性
由于客户需求,所以进行对文章的arclist标签进行设置当前样式(currentstyle),修改前记得备份. dede版本v5.7sp 找到PHP修改: include/taglib/arclist ...
- (light oj 1306) Solutions to an Equation 扩展欧几里得算法
题目链接:http://lightoj.com/volume_showproblem.php?problem=1306 You have to find the number of solutions ...
- Excel阅读模式/单元格行列指示/聚光灯开发 技术要点再分享
1. 引言 文题中所谓技术要点再分享,本意是想在大神Charltsing Liu的博文“简单介绍Excel单元格行列指示的实现原理(俗称聚光灯功能)”的基础上写一点个人开发体会.写本文的初衷有三点,一 ...
- Java的selenium代码随笔(6)
//获取元素列表public List<WebElement> ListElements(WebElement webElement, By parentBy, By childrenBy ...
- gVim编辑器 操作篇
gVim是一款强大的编辑器,可以满足大部分语言的编程需要.尤其是其自带的模板定制功能对于Verilog来说非常受用.然而gVim有很多操作是不同于其他编辑器的,这让很多初学者望而却步,因此,本文将gV ...
- Linux(Ubuntu)使用日记------markdown文件与pdf,doc,docx文件的相互转化(pandoc使用)
安装: sudo apt-get install pandoc 使用: man pandoc 查看帮助文档 直接转换,命令如下: pandoc -f markdown -t docx ./test ...
- win 执行puppet
C:\scripts\win_exec_proxy.bat \\adsoft.base-fx.com\puppet\puppet\files\Windows_10_x64\C\user\logon\ ...
- 触发器SQL
CREATE TRIGGER FUEL.HDGJcoaldayexpend1_insertTRIGGER AFTER INSERT ON FUEL.coaldayexpend1 REFERENCING ...
- postgresql数据库去重方法
数据库去重有很多方法,下面列出目前理解与使用的方法 第一种 通过group by分组,然后将分组后的数据写入临时表然后再写入另外的表,对于没有出现再group by后面的field可以用函数max,m ...