import sun.misc.Unsafe;

/**
* JDK8
* JDK 的此jar 包中的 Unsafe 类提供了硬件级别的原子性操作
*/
public class UnsafeTest {
//获得Unsafe的一个实例
static final Unsafe unsafe1 = Unsafe.getUnsafe();
static final long stateOffset;
private volatile long state = 0; static {
try {
//获取 UnsafeTest 类里面的 state 变量, 在 UnsafeTest 对象里面的内存偏移量地址并将其保存到 stateOffset 变量中。
//getDeclaredFields():获得某个类的所有声明的字段
stateOffset = unsafe1.objectFieldOffset(UnsafeTest.class.getDeclaredField("state"));
} catch (NoSuchFieldException e) {
System.out.println(e.getLocalizedMessage());
throw new Error(e);
}
}
public static void main(String[] args){
UnsafeTest unsafeTest = new UnsafeTest();
//如果 test 对象中 内存偏移量为 stateOffset 的 state 变量的值为 0,则更新该值为 1
boolean b = unsafe1.compareAndSwapInt(unsafeTest, stateOffset, 0, 1);
System.out.println(b);
//Exception in thread "main" java.lang.ExceptionInInitializerError
//Caused by: java.lang.SecurityException: Unsafe
// at sun.misc.Unsafe.getUnsafe(Unsafe.java:90)
// at com.fly.two.UnsafeTest.<clinit>(UnsafeTest.java:10)
//正常无法实例化 Unsafe 类
}
}
import sun.misc.Unsafe;

import java.lang.reflect.Field;

import static com.fly.two.UnsafeTest.unsafe1;

/**
* JDK8
* 通过反射来获取 Unsafe 实例方法。
*/
public class UnsafeTest2 {
//获得Unsafe的一个实例
static final Unsafe unsafe;
static final long stateOffset;
private volatile long state = 0; static {
try {
//使用反射获取Unsafe的成员变量theUnsafe
Field field = Unsafe.class.getDeclaredField("theUnsafe");
//设置为可存取
field.setAccessible(true);
//获取该变量的值
unsafe = (Unsafe) field.get(null);
//获取 UnsafeTest 类里面的 state 变量, 在 UnsafeTest 对象里面的内存偏移量地址并将其保存到 stateOffset 变量中。
//getDeclaredFields():获得某个类的所有声明的字段
stateOffset = unsafe.objectFieldOffset(UnsafeTest2.class.getDeclaredField("state"));
} catch (Exception e) {
System.out.println(e.getLocalizedMessage());
throw new Error(e);
}
}
public static void main(String[] args){
UnsafeTest2 unsafeTest = new UnsafeTest2();
//如果 test 对象中 内存偏移量为 stateOffset 的 state 变量的值为 0,则更新该值为 1
boolean b = unsafe.compareAndSwapInt(unsafeTest, stateOffset, 0, 1);
System.out.println(b);//true
}
}

12.Unsafe原子性操作的更多相关文章

  1. 一段JAVA代码了解多线程,JUC、CAS原子性操作。

    @Test public void testPaceController_multiThread() throws InterruptedException { final PaceControlle ...

  2. ORM基础4 跨表查询+原子性操作

    一.跨表查询 1.# # 正向查找 对象查找 # book_obj = models.Book.objects.get(id=3) # print(book_obj) # ret = book_obj ...

  3. linux系统编程:IO读写过程的原子性操作实验

    所谓原子性操作指的是:内核保证某系统调用中的所有步骤(操作)作为独立操作而一次性加以执行,其间不会被其他进程或线程所中断. 举个通俗点的例子:你和女朋友OOXX的时候,突然来了个电话,势必会打断你们高 ...

  4. Mysql-事务,原子性操作

    事物分为 自动(默认的)和手动(需开启事务)两种 -- 事务 start transaction; -- commite; 提交事务 -- rollback; 回滚事务 create table if ...

  5. 02.java并发编程之原子性操作

    一.原子性操作 1.ThreadLocal 不同线程操作同一个 ThreadLocal 对象执行各种操作而不会影响其他线程里的值 注意:虽然ThreadLocal很有用,但是它作为一种线程级别的全局变 ...

  6. 并发库应用之二 & Java原子性操作类应用

    Java5的线程并发库中,提供了一组atomic class来帮助我们简化同步处理.基本工作原理是使用了同步synchronized的方法实现了对一个long, integer, 对象的增.减.赋值( ...

  7. Linux内核部件分析 原子性操作atomic_t

    在任何处理器平台下,都会有一些原子性操作,供操作系统使用,我们这里只讲x86下面的.在单处理器情况下,每条指令的执行都是原子性的,但在多处理器情况下,只有那些单独的读操作或写操作才是原子性的.为了弥补 ...

  8. 多线程(四)~数据操作的原子性,使用原子性操作AutomicInteger替换非原子性的i++的操作

    这一章,我们要来验证volatile关键字不是原子性的,OK,还是用代码来说话. ①.线程类,操作i++ 500次 package com.multiThread.thread; publicclas ...

  9. 新姿势!Redis中调用Lua脚本以实现原子性操作

    背景:有一服务提供者Leader,有多个消息订阅者Workers.Leader是一个排队程序,维护了一个用户队列,当某个资源空闲下来并被分配至队列中的用户时,Leader会向订阅者推送消息(消息带有唯 ...

随机推荐

  1. Es学习第八课, Filter、bool和范围查询

    Filter过滤查询 filter是不计算相关性的,同时可以缓存.因此filter速度快于query. 我们先在kibana上先添加数据来做准备 POST /lib4/items/_bulk { &q ...

  2. LOJ2586 APIO2018 选圆圈

    考前挣扎 KD树好题! 暴力模拟 通过kd树的结构把子树内的圈圈框起来 然后排个序根据圆心距 <= R1+R2来判断是否有交点 然后随便转个角度就可以保持优越的nlgn啦 卡精度差评 必须写ep ...

  3. java Map的四种遍历方式

    1.这是最常见的并且在大多数情况下也是最可取的遍历方式,在键值都需要时使用. Map<Integer, Integer> map = new HashMap<Integer, Int ...

  4. centos6 / centos7 安装apache

    =================centos6.1 安装apache===================== 安装: yum -y install httpd 启动 /etc/init.d/htt ...

  5. <三剑客> 老三:grep命令用法

    grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正 ...

  6. SPOJ - FTOUR2 (点分治+树状数组)

    题目:https://vjudge.net/contest/307753#problem/I 题意:有一颗树,上面有白色黑色点,每个点上有一个权值,权值可以为负,现在我要求一条路径,权值和最大,这条路 ...

  7. Linux 删除特殊文件名的文件

    1.文件名含有特殊字符: 1) 执行 ls -i 命令 ,文件前面会出现一个数字,这个数字是文件的节点号 2) 使用find命令删除 find ./ -inum 节点号 -delete 2.文件名是以 ...

  8. _new__和__init__的区别

    __new__是Python面向对象语言中一个很少用的函数,更多使用的是__init__这个函数.例如: class Book(object): def __init__(self, title): ...

  9. dubbo 漫谈一

    转:腾信视频 阿甘 https://ke.qq.com/course/216518 https://blog.csdn.net/xlgen157387/article/details/51865289 ...

  10. git修改commiter date

    GIT: change commit date to author date git filter-branch --env-filter 'export GIT_COMMITTER_DATE=&qu ...