通过 UNSAFE 来实现一个 Atomic 的 CAS 辅助类【原创】
public abstract class AbstractUnSafeCas<T> {
@SuppressWarnings("unused")
private volatile Object value;
private static final AtomicHelper ATOMIC_HELPER;
private final CountDownLatch countDownLatch = new CountDownLatch(1);
static {
ATOMIC_HELPER = new AtomicHelper();
}
private static class AtomicHelper {
private static final sun.misc.Unsafe UNSAFE;
private static final long VALUE_OFFSET;
static {
sun.misc.Unsafe unsafe;
try {
unsafe = sun.misc.Unsafe.getUnsafe();
} catch (SecurityException tryReflectionInstead) {
unsafe = AccessController.doPrivileged(new PrivilegedAction<Unsafe>() {
@Override
@SneakyThrows
public Unsafe run() {
Class<sun.misc.Unsafe> unsafeClass = sun.misc.Unsafe.class;
for (Field f : unsafeClass.getDeclaredFields()) {
f.setAccessible(true);
Object o = f.get(null);
if (unsafeClass.isInstance(o)) {
return unsafeClass.cast(o);
}
}
throw new NoSuchFieldError("the Unsafe");
}
});
}
try {
VALUE_OFFSET = unsafe.objectFieldOffset(AbstractUnSafeAtomicHelper.class.getDeclaredField("value"));
} catch (Exception e) {
throw Throwables.propagate(e);
}
UNSAFE = unsafe;
}
public boolean casValue(AbstractUnSafeAtomicHelper<?> obj, Object expect, Object update) {
return UNSAFE.compareAndSwapObject(obj, VALUE_OFFSET, expect, update);
}
}
public boolean set(T value) {
Preconditions.checkArgument(null != value, "The value to be setted is null");
if (ATOMIC_HELPER.casValue(this, null, value)) {
countDownLatch.countDown();
return true;
}
return false;
}
@SneakyThrows
public T get(boolean blockUntilValueIsNotNull) {
if (blockUntilValueIsNotNull) {
countDownLatch.await();
}
@SuppressWarnings("unchecked")
T asT = (T) value;
return asT;
}
@SneakyThrows
public T get(Long timeout, TimeUnit timeUnit) {
countDownLatch.await(timeout, timeUnit);
@SuppressWarnings("unchecked")
T asT = (T) value;
return asT;
}
}
通过 UNSAFE 来实现一个 Atomic 的 CAS 辅助类【原创】的更多相关文章
- 无锁同步-JAVA之Volatile、Atomic和CAS
1.概要 本文是无锁同步系列文章的第二篇,主要探讨JAVA中的原子操作,以及如何进行无锁同步. 关于JAVA中的原子操作,我们很容易想到的是Volatile变量.java.util.concurren ...
- 无锁同步-C++11之Atomic和CAS
1.概要 本文是无锁同步系列文章的第一篇,主要探讨C++11中的Atomic. 我们知道在C++11中引入了mutex和方便优雅的lock_guard.但是有时候我们想要的是性能更高的无锁实现,下面我 ...
- 并发之ATOMIC原子操作--CAS乐观锁原理(二)
1.乐观锁介绍 程序完成并发操作时,访问数据时每次不加锁,假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止.就是当去做某个修改或其他操作的时候它认为不会有其他线程来做同样的操作(竞争) ...
- 如何在asp.net中使用多线程及队列,异步处理一个耗时的任务(原创)
最近想在使用.net 的队列处理一些耗时的工作.经过考虑,需要先设计一个类,类中包含一个静态的队列.主要是写队列和读取队列. public class PaperCalculator { // 用于存 ...
- 为树莓派添加一个强实时性前端[原创cnblogs.com/helesheng]
树莓派是最近流行嵌入式平台,其自由的开源特性以及低廉的价格,吸引了来 自全球的大量极客和计算机大咖的关注.来自各大树莓派社区的幕后英雄,无私地在这个开源硬件平台上做了大量的工作,将其打造成了世界上通用 ...
- Android入门:封装一个HTTP请求的辅助类
前面的文章中,我们曾经实现了一个HTTP的GET 和 POST 请求: 此处我封装了一个HTTP的get和post的辅助类,能够更好的使用: 类名:HttpRequestUtil 提供了如下功能: ( ...
- 自己写的一个 CGBLIB 动态代理【原创】
CGLIB代理类,用CGLIB来实现一个代理类.大致原理描述如下: 1.使用Enhancer类来生成一个继续于被代理类的子类,此子类会重写被代理类(父类)中所有的非final的public方法: 2. ...
- 如果用HTML5做一个在线视频聊天【原创】
首先使用node.js 搭建一个简易的 websocket服务器: var cons = new Array(); var ws = require('ws').Server; var server ...
- 一个不错的文章-【原创】2014年信息安全产品及厂家分类-SOC&SIEM安全厂家 | Srxh1314
转载:http://www.srxh1314.com/2014-sec-company-soc-siem.html http://www.bugsec.org/1598.html http://www ...
随机推荐
- SpringBoot+Jpa+SpringSecurity+Redis+Vue的前后端分离开源系统
项目简介: eladmin基于 Spring Boot 2.1.0 . Jpa. Spring Security.redis.Vue的前后端分离的后台管理系统,项目采用分模块开发方式, 权限控制采用 ...
- vue element-ui tree 根节点固定子节点懒加载 首次加载根节点并展开
关键代码: <el-tree ref="foldTree" node-key="id" :highlight-current="true&quo ...
- Appium的测试简单流程
1.环境的搭建:jdk,SDK,appium,手机模拟器(夜神模拟器) 2.appium的运作流程图: 图中的流程步骤简单来说是: 1.测试脚本写入appium: 2.appium创建连接,将脚本利用 ...
- H3C STA>PC的数据转发
- 【爬虫】使用selenium设置cookie
https://segmentfault.com/a/1190000015826749
- 通用工业协议(CIP)形式化的安全分析(前期概念的梳理)
1.CIP的概念的梳理 CIP是为开放的现场总线DeviceNet ControlNet EtherNet/IP 网络提供公共的应用层和设备描述, CIP是基于对象的协议,使用生产者/消费者模型, ...
- (七)Kubernetes Service资源
Service概述 为什么要使用Service Kubernetes Pod是平凡的,由Deployment等控制器管理的Pod对象都是有生命周期的,它们会被创建,也会意外挂掉.虽然它们可以由控制器自 ...
- nginx+Gunicorn部署你的Flask项目
https://www.cnblogs.com/minsons/articles/8191219.html 大家在学习python的时候常常都是输入 python 文件名.py 这样启动小脚本 但实际 ...
- C# Chart 曲线(多曲线展示)
//绑定显示曲线数据(Chart控件名:) //X轴标题 this.CurveChart.ChartAreas["ChartArea1"].AxisX.Title = " ...
- linux学习14 Linux运维高级系统应用-glob通配及IO重定向
一.回顾 1.bash基础特性:命令补全,路径补全,命令引用 2.文件或目录的复制,移动及删除操作 3.变量:变量类型 存储格式,数据表示范围,参与运算 二.bash的基础特性 1.globbing: ...