Java和C++语言的一个重要区别就是Java中我们无法直接操作一块内存区域,不能像C++中那样可以自己申请内存和释放内存。Java中的Unsafe类为我们提供了类似C++手动管理内存的能力,不建议使用该类

(1)Unsafe对int,long ,Object的CAS操作

public class UnsafeTest {

    public static void main(String[] args) throws Exception {
ExecutorService service = Executors.newFixedThreadPool();
Counter counter = new CASCounter();
long start = System.currentTimeMillis();
for (int i = ; i < ; i++) {
service.submit(new CounterRunnable(counter, ));
}
service.shutdown();
service.awaitTermination(, TimeUnit.HOURS);
System.out.println("counter : " + counter.getCount());
System.out.println("time elapse : " + (System.currentTimeMillis() - start)); } public static Unsafe getUnsafe() throws IllegalAccessException {
Field unsafeField = Unsafe.class.getDeclaredFields()[];
unsafeField.setAccessible(true);
Unsafe unsafe = (Unsafe) unsafeField.get(null);
return unsafe;
} interface Counter {
void increment(); long getCount();
} static class StupidCounter implements Counter { private long value = ; @Override
public void increment() {
value++;
} @Override
public long getCount() {
return value;
} } static class SynCounter implements Counter { private long value = ; @Override
public synchronized void increment() {
value++;
} @Override
public long getCount() {
return value;
} } static class LockCounter implements Counter { private long value = ; private Lock lock = new ReentrantLock(); @Override
public void increment() {
lock.lock();
try {
value++;
} finally {
lock.unlock();
}
} @Override
public long getCount() {
return value;
} } static class AtomicCounter implements Counter { private AtomicLong value = new AtomicLong(); @Override
public void increment() {
value.incrementAndGet();
} @Override
public long getCount() {
return value.get();
} } static class CASCounter implements Counter { private Unsafe unsafe;
private long offset;
private volatile long value = ; CASCounter() throws Exception {
unsafe = getUnsafe();
offset = unsafe.objectFieldOffset(CASCounter.class.getDeclaredField("value"));
} @Override
public void increment() {
long current = value;
while (!unsafe.compareAndSwapLong(this, offset, value, value + )) {
current = value;
}
} @Override
public long getCount() {
return value;
} } static class CounterRunnable implements Runnable {
Counter counter;
int num; CounterRunnable(Counter counter, int num) {
this.counter = counter;
this.num = num;
} @Override
public void run() {
for (int i = ; i < num; i++) {
counter.increment();
}
}
} }

(2)可以绕过构造函数实例化对象

public class UnsafePlayer {

    // 通过反射实例化Unsafe
public static Unsafe getUnsafe() throws IllegalAccessException {
Field unsafeField = Unsafe.class.getDeclaredFields()[];
unsafeField.setAccessible(true);
Unsafe unsafe = (Unsafe) unsafeField.get(null);
return unsafe;
} public static void main(String[] args) throws Exception {
// 获取Unsafe
Unsafe unsafe = getUnsafe();
// 实例化Player
Player player = (Player) unsafe.allocateInstance(Player.class);
player.setName("li lei");
System.out.println(player.getName());
}
} class Player {
private String name; private Player() { } public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

(3)直接修改内存的值

/**
*
* 直接修改了Foo对象的current值
*/
public class UnsafeTest2 { // 通过反射实例化Unsafe
public static Unsafe getUnsafe() throws IllegalAccessException {
Field unsafeField = Unsafe.class.getDeclaredFields()[];
unsafeField.setAccessible(true);
Unsafe unsafe = (Unsafe) unsafeField.get(null);
return unsafe;
} public static void main(String[] args) throws Exception {
Foo foo = new Foo();
Unsafe unsafe = getUnsafe();
Field field = Foo.class.getDeclaredField("current");
unsafe.putInt(foo, unsafe.objectFieldOffset(field), );
foo.work();
}
} class Foo { private int current = ; public void work() {
if (current == ) {
System.out.println(" I am working ");
}
} }

Unsafe例子的更多相关文章

  1. CSharpGL(25)一个用raycast实现体渲染VolumeRender的例子

    CSharpGL(25)一个用raycast实现体渲染VolumeRender的例子 本文涉及的VolumeRendering相关的C#代码是从(https://github.com/toolchai ...

  2. unsafe

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

  3. 【实战Java高并发程序设计 1】Java中的指针:Unsafe类

    是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...

  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. c中使用gets() 提示warning: this program uses gets(), which is unsafe.

    今天在C代码中使用gets()时提示“warning: this program uses gets(), which is unsafe.”,然后这个程序还能运行,无聊的我开始查阅资料,为啥gets ...

  7. sun.misc.Unsafe的理解

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

  8. Unsafe与CAS

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

  9. Java为什么会引入及如何使用Unsafe

    综述 sun.misc.Unsafe至少从2004年Java1.4开始就存在于Java中了.在Java9中,为了提高JVM的可维护性,Unsafe和许多其他的东西一起都被作为内部使用类隐藏起来了.但是 ...

随机推荐

  1. AppScan基础使用 - 初学篇

    最近找工作,阿里的面试官问过了安全,以前面试中也问到了安全,呆过的公司,朋友呆过的公司,发现安全测试很少 ,可能是应用的比较少. 当今社会安全还是比较重要的,学学有好处,大概了解下  .因为个人比较懒 ...

  2. python网络编程-1

    1.网络基础 回顾计算IP所处网段方式 #128 64 32 16 8 4 2 1 #IP1 = 192.168.9.1/24 # 11000000 10101000 00001001 0000000 ...

  3. Android RadioButton控件

    RadioButton   单选按钮 常用属性: text 文本 checked=“true” 默认选中 一组互斥的单选按钮要放在RadioGroup中.RadioGroup常用属性: orienta ...

  4. selenium和AutoIt工具辅助下载和上传

    上传 根据AutoIt Windows Info 所识别到的控件信息打开SciTE Script Editor编辑器,编写脚本. ;ControlFocus("title",&qu ...

  5. Jenkins 打tag回滚

    利用jenkins,从gitlab上拉取代码,然后发布,如果想进行代码回退,其实还是代码发布,拉取的时候,选择合适的标签. 一.利用Git parameter插件选择branch或tag.下面的文本参 ...

  6. Ubuntu18.04.2下安装 RTX2080 Nvidia显卡驱动

    转载请注明出处:BooTurbo  https://www.cnblogs.com/booturbo/p/11261903.html 不久前入手了蓝天P870TM1G准系统,配置如下: 1. Z370 ...

  7. 201871010135 张玉晶《面向对象程序设计(java)》第十二周学习总结

      内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/zyja/p/118654 ...

  8. 解决Android中AsyncTask的多线程阻塞问题

    Android开发中执行耗时操作并更新UI时,通常有三种方式:1.直接调用runOnUiThread(new Runnable(){}),使用简单,但不能在Activity之外的环境使用,如View. ...

  9. 【视频技术】EasyDarwin

  10. 并发、并行、同步、异步、全局解释锁GIL、同步锁Lock、死锁、递归锁、同步对象/条件、信号量、队列、生产者消费者、多进程模块、进程的调用、Process类、

    并发:是指系统具有处理多个任务/动作的能力. 并行:是指系统具有同时处理多个任务/动作的能力. 并行是并发的子集. 同步:当进程执行到一个IO(等待外部数据)的时候. 异步:当进程执行到一个IO不等到 ...