import java.lang.reflect.Field; import sun.misc.Unsafe; /** * @author fhj * @date 2018年5月7日 下午4:16:21 * @version <b>1.0.0</b> */ public class CompareAndSwap { private static final Unsafe unsafe; private static final long fieldOffset; static { try { Class<?> clazz = User.class; unsafe = getUnsafe(); fieldOffset = unsafe.objectFieldOffset(clazz.getDeclaredField("age"));//获取User中age字段在内存中的偏移量 } catch (Exception ex) { throw new Error(ex); } } /** * boolean sun.misc.Unsafe.compareAndSwapInt(Object arg0, long arg1, int arg2, int arg3) * @param arg0-比较的对象 * @param arg1-需要修改的字段内存偏移量 * @param arg2-期待值(对比参考值) * @param arg3-修改的值 * 描述:argo对象中arg1偏移量指向的字段值如果等于arg2,则将arg1偏移量指向的字段值改为arg3,返回true * 否则不做任何操作,返回false */ public static void main(String[] args) { User user = new User(10); try { Boolean result; result = unsafe.compareAndSwapInt(user, fieldOffset, 10, 12); System.out.println(result);//true System.out.println(user.getAge());//12 result = unsafe.compareAndSwapInt(user, fieldOffset, 10, 14); System.out.println(result);//false System.out.println(user.getAge());//12 result = unsafe.compareAndSwapInt(user, fieldOffset, 12, 14); System.out.println(result);//true System.out.println(user.getAge());//14 } catch (Exception ex) { ex.printStackTrace(); } } /** * 通过代码反射获取Unsafe静态类 * 直接通过Unsafe.getUnsafe()获取会抛安全性异常 */ private static Unsafe getUnsafe() { try { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); Unsafe unsafe = (Unsafe) field.get(null); return unsafe; } catch (Exception ex) { throw new Error(ex); } } static class User { private int age; User(int age) { this.age = age; } public int getAge() { return age; } } }
总结:因Unsafe类中的compareAndSwap方法是原子的,故可用来实现高性能的、无锁的数据结构
相关推荐
CS使用Unsafe的方法向DLL传参 由一个实例开始: c++中函数声明如下: bool Test(float** arr,int rows,int cols); 这个函数在C#中怎么使用,直接传入single[,]出现错误”尝试读取或写入受保护的内存",那到底...
JDK8中sun.misc下UnSafe类源代码 UnSafe.java JDK8中sun.misc下UnSafe类源代码 UnSafe.java
对Netty中的Unsafe做了简单的总结,构建自己的知识网!!!
解决VS中This function or variable may be unsafe的安全检查错误
JDK8中sun.misc包下的UnSafe类,想查看源码的就拿走,没积分的请与我联系!xtfggef@gmail.com
sun.misc.Unsafe源码文件,需要学习的带走。希望能够帮助到大家。
本篇文章给大家分享了关于Java中unsafe操作的相关知识点以及相关的实例代码,有需要的朋友可以学习参考下。
并发作为 Java 中非常重要的一部分,其内部大量使用了 Unsafe 类,它为 java.util.concurrent 包中的类提供了底层支持。
解决VS中This function or variable may be unsafe的安全检查错误
在阅读AtomicInteger的源码时,看到了这个类:sum.msic.Unsafe,之前从没见过。所以花了点时间研究了下,下面这篇文章主要给大家介绍了关于Java中Unsafe类的相关资料,需要的朋友可以参考借鉴,下面来一起学习学习吧
Unsafe类是rt.jar包中的类,它提供了原子级别的操作,它的方法都是native方法,通过JNI访问本地的C++库。它的出现是为了解决在高并发下的数据同步问题。synchronize关键字修饰的代码块被加了独占锁,相同时间只能有...
unsafe-helper-包含一些简单的方法,这些方法使使用sun.misc.Unsafe更容易。 unsafe-collection-在ArrayList上建模的示例列表,该列表不存储对集合内对象的引用,而是直接将元素复制到列表中。 这有一些有趣的特性...
Java Unsafe类1
主要为大家详细介绍了解决Python出现'_warn_unsafe_extraction'问题的方法,感兴趣的小伙伴们可以参考一下
基于DEMATEL和ISM方法的煤矿不安全行为影响因素及模式研究,李爽,吴雪,煤矿生产中,在机器设计和布置合理的情况下,控制人的不安全行为显得尤为重要。不安全行为的发生是诸多因素相互作用的结果,本文
其实Java官方不推荐使用Unsafe类,因为官方认为,这个类别人很难正确使用,非正确使用会给JVM带来致命错误...但还是要会使用,下面这篇文章就来给大家简单的谈一谈关于Java中Unsafe类的相关资料,需要的朋友可以参考下
以完全通用的非类型安全方式使用指针和非托管内存的不安全方法。 NuGet 当前的NuGet软件包名称为DotNetCross.Memory.Unsafe 。 在这里能找到它: 已过时的NuGet软件包名称和URL 不幸的是,当我第一次创建nuspec ...
java魔法类:Unsafe应用
JDK8中sun.misc下UnSafe类源代码 UnSafe.java
Oracle正在计划从Java 9中去掉Unsafe类,如果真是如此影响就太大了。 Unsafe类提供了以下这些功能: 一、内存管理。包括分配内存、释放内存等。 该部分包括了allocateMemory(分配内存)、reallocat