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