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;
} }

最新文章

  1. Jquery知识点梳理
  2. CSS编写技巧
  3. KMP匹配算法
  4. JS转换时间戳为“刚刚”、“1分钟前”、“2小时前”“1天前”等格式
  5. [ACM_几何] Transmitters (zoj 1041 ,可旋转半圆内的最多点)
  6. WebRTC学习资料大全
  7. Eclipse中安装可以新建html文件的插件(Eclipse HTML Editor)
  8. POJ 2528 Mayor’s posters
  9. ORACLE【0】:基本操作
  10. 【转】MyEclipse8.5集成Tomcat7时的启动错误:Exception in thread “main” java.lang.NoClassDefFoundError org/apache/commons/logging/LogFactory
  11. QT 内存泄露 检测
  12. excel导出的集中情况
  13. php 编译安装curl 时候出现问题
  14. myBatis学习(9):一级缓存和二级缓存
  15. (转)ubuntu 文件目录结构
  16. iOS开发进阶之 UIWebView
  17. [连载]Java程序设计(04)---任务驱动的方法:工资结算系统
  18. 基于React Native的58 APP开发实践
  19. Matlab入门学习(矩阵、函数、绘图的基本使用)
  20. bzoj3597[Scoi2014]方伯伯运椰子 01分数规划+spfa判负环

热门文章

  1. TP5.0使用助手函数model出现\common\Model\类不存在
  2. C#8.0——异步流(AsyncStream)
  3. 【转】UCOSIII基础知识点
  4. rest framework 之序列化
  5. LINUX基础学习之基础命令(3)--2019-11-22
  6. BZOJ-1042:硬币购物(背包+容斥)
  7. Java-Modifier类常用方法详解
  8. Ribbon自带负载均衡策略
  9. LeetCode 916. Word Subsets
  10. 压缩、解压命令——gzip、gunzip、tar、zip、bzip2