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 辅助类【原创】的更多相关文章

  1. 无锁同步-JAVA之Volatile、Atomic和CAS

    1.概要 本文是无锁同步系列文章的第二篇,主要探讨JAVA中的原子操作,以及如何进行无锁同步. 关于JAVA中的原子操作,我们很容易想到的是Volatile变量.java.util.concurren ...

  2. 无锁同步-C++11之Atomic和CAS

    1.概要 本文是无锁同步系列文章的第一篇,主要探讨C++11中的Atomic. 我们知道在C++11中引入了mutex和方便优雅的lock_guard.但是有时候我们想要的是性能更高的无锁实现,下面我 ...

  3. 并发之ATOMIC原子操作--CAS乐观锁原理(二)

    1.乐观锁介绍 程序完成并发操作时,访问数据时每次不加锁,假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止.就是当去做某个修改或其他操作的时候它认为不会有其他线程来做同样的操作(竞争) ...

  4. 如何在asp.net中使用多线程及队列,异步处理一个耗时的任务(原创)

    最近想在使用.net 的队列处理一些耗时的工作.经过考虑,需要先设计一个类,类中包含一个静态的队列.主要是写队列和读取队列. public class PaperCalculator { // 用于存 ...

  5. 为树莓派添加一个强实时性前端[原创cnblogs.com/helesheng]

    树莓派是最近流行嵌入式平台,其自由的开源特性以及低廉的价格,吸引了来 自全球的大量极客和计算机大咖的关注.来自各大树莓派社区的幕后英雄,无私地在这个开源硬件平台上做了大量的工作,将其打造成了世界上通用 ...

  6. Android入门:封装一个HTTP请求的辅助类

    前面的文章中,我们曾经实现了一个HTTP的GET 和 POST 请求: 此处我封装了一个HTTP的get和post的辅助类,能够更好的使用: 类名:HttpRequestUtil 提供了如下功能: ( ...

  7. 自己写的一个 CGBLIB 动态代理【原创】

    CGLIB代理类,用CGLIB来实现一个代理类.大致原理描述如下: 1.使用Enhancer类来生成一个继续于被代理类的子类,此子类会重写被代理类(父类)中所有的非final的public方法: 2. ...

  8. 如果用HTML5做一个在线视频聊天【原创】

    首先使用node.js 搭建一个简易的 websocket服务器: var cons = new Array(); var ws = require('ws').Server; var server ...

  9. 一个不错的文章-【原创】2014年信息安全产品及厂家分类-SOC&SIEM安全厂家 | Srxh1314

    转载:http://www.srxh1314.com/2014-sec-company-soc-siem.html http://www.bugsec.org/1598.html http://www ...

随机推荐

  1. svn进行上传项目

    当svn的服务器搭建成功后,就可以进行上传项目了. 右键,选择客户端的repo-browser, 输入地址 然后就可以浏览所有项目: 然后在版本仓库上,右键,add folder, 添加对应的文件夹即 ...

  2. springboot异常处理方式

    一.异常处理思路 异常捕获的是unchecked型异常,因为checked异常在代码中年已经处理过,当然是在使用try-catch处理.这里首先使用ExceptionHandler捕获全局异常,这样如 ...

  3. docker-ce添加国内源-阿里docker-hub镜像

    问题现象: WARNING: bridge-nf-call-iptables is disabled WARNING: bridge-nf-call-ip6tables is disabled 问题解 ...

  4. Underscore——JS函数库

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826065.html underscore是什么——它是一个js函数库 jQuery统一了不同浏览器之间的 ...

  5. golang测试

    简述 Go语言中自带有一个轻量级的测试框架testing和自带的go test命令来实现单元测试和性能测试. go test [-c] [-i] [build flags] [packages] [f ...

  6. git远程上的分支到本地

    先想一个自己要在本地新建的分支名称,qianjinyan git checkout -b qianjinyan origin/SELLER-2248-1018 git branch 查看分支 git ...

  7. mysql创建临时表,将查询结果插入已有的表

    A.临时表再断开于mysql的连接后系统会自动删除临时表中的数据,但是这只限于用下面语句建立的表:1)定义字段  CREATE TEMPORARY TABLE tmp_table (      nam ...

  8. Normalize.css重置化样式表

    Normalize.css是一种CSS reset的替代方案.它在默认的HTML元素样式上提供了跨浏览器的高度一致性.相比于传统的CSS reset,Normalize.css是一种现代的.为HTML ...

  9. [图解]Windows下使用Zend Studio 10和XAMPP 1.8搭建开发环境,ZendFramework 2 HelloWorld

    1.下载并安装 ZendStudio,搜一个破解版 XAMPP,官网下载:https://www.apachefriends.org/index.html 2.打开ZendStudio新建一个php项 ...

  10. autoRoll_UpDown()|上下滚动函数|无缝|自动(自带demo)

    autoRoll_UpDown函数 function autoRoll_UpDown($domObj,speed){ //$domObj 外围容器的jQuery式元素对象 speed 滚动速度,单位毫 ...