12.Unsafe原子性操作
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原子性操作的更多相关文章
- 一段JAVA代码了解多线程,JUC、CAS原子性操作。
@Test public void testPaceController_multiThread() throws InterruptedException { final PaceControlle ...
- ORM基础4 跨表查询+原子性操作
一.跨表查询 1.# # 正向查找 对象查找 # book_obj = models.Book.objects.get(id=3) # print(book_obj) # ret = book_obj ...
- linux系统编程:IO读写过程的原子性操作实验
所谓原子性操作指的是:内核保证某系统调用中的所有步骤(操作)作为独立操作而一次性加以执行,其间不会被其他进程或线程所中断. 举个通俗点的例子:你和女朋友OOXX的时候,突然来了个电话,势必会打断你们高 ...
- Mysql-事务,原子性操作
事物分为 自动(默认的)和手动(需开启事务)两种 -- 事务 start transaction; -- commite; 提交事务 -- rollback; 回滚事务 create table if ...
- 02.java并发编程之原子性操作
一.原子性操作 1.ThreadLocal 不同线程操作同一个 ThreadLocal 对象执行各种操作而不会影响其他线程里的值 注意:虽然ThreadLocal很有用,但是它作为一种线程级别的全局变 ...
- 并发库应用之二 & Java原子性操作类应用
Java5的线程并发库中,提供了一组atomic class来帮助我们简化同步处理.基本工作原理是使用了同步synchronized的方法实现了对一个long, integer, 对象的增.减.赋值( ...
- Linux内核部件分析 原子性操作atomic_t
在任何处理器平台下,都会有一些原子性操作,供操作系统使用,我们这里只讲x86下面的.在单处理器情况下,每条指令的执行都是原子性的,但在多处理器情况下,只有那些单独的读操作或写操作才是原子性的.为了弥补 ...
- 多线程(四)~数据操作的原子性,使用原子性操作AutomicInteger替换非原子性的i++的操作
这一章,我们要来验证volatile关键字不是原子性的,OK,还是用代码来说话. ①.线程类,操作i++ 500次 package com.multiThread.thread; publicclas ...
- 新姿势!Redis中调用Lua脚本以实现原子性操作
背景:有一服务提供者Leader,有多个消息订阅者Workers.Leader是一个排队程序,维护了一个用户队列,当某个资源空闲下来并被分配至队列中的用户时,Leader会向订阅者推送消息(消息带有唯 ...
随机推荐
- CentOS7.2安装Oracle12.1.0.2
Centos7.2环境安装(安装桌面) #安装界面 #查看版本 cat /etc/redhat-release #查看连接 ifconfig eth0 echo "127.0.0.1 tes ...
- Kafka初识
1.概述 1.1.Apache Kafka是一个 分布式 流处理 平台: 2.Kafka适应于什么场景? 2.1.构造 实时 流数据管道,在 系统 或 应用之间 可靠地获取数据(相当 ...
- nyoj 762:第k个互质数
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=762 直接给代码好了,容斥原理具体看<组合数学> #include<bi ...
- solr测试用的配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- 偏函数(partial)
from functools import partial def add(a,b,c,d): return a+b+c+d add = partial(add,1,2) print(add(3,4) ...
- 在Developerkit开发板上运行blink例程
本文将介绍怎么样在VScode环境下,将AliOS Tings提供的blink例程在Developerkit开发板上运行起来. DeveloperKit开发板 在例程中分别用到两个led和一个按钮 ...
- spring-boot和redis的缓存使用
1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.Maven Plugin管理 pom.xml配置代码: <?xml versio ...
- windows系统的安装时间怎么查看
方法一:利用命令符窗口查询 直接按下Windows+R组合键 出现运行对话框(或 点击开始—运行),输入cmd,进入命令符窗口 然后,在该界面下输入”systeminfo”,然后回车,等待系统自动运 ...
- django搭建一个小型的服务器运维网站-重启服务器的进程
目录 项目介绍和源码: 拿来即用的bootstrap模板: 服务器SSH服务配置与python中paramiko的使用: 用户登陆与session; 最简单的实践之修改服务器时间: 查看和修改服务器配 ...
- Transform.Find()
代码演示: using System.Collections;using System.Collections.Generic;using UnityEngine; public class Tran ...