java unsafe cas_java并发Unsafe和CAS
Unsafe提供了一些可以直接操控内存和线程的底层操作。被JDK广泛应用于java.nio和并发包等实现中,但是不建议在生产环境中使用。
如何使用:
Unsafe类是如此地不安全,以至于JDK开发者增加了很多特殊限制来访问它。
1、私有的构造器
2、工厂方法getUnsafe()的调用器只能被Bootloader加载,否则抛出SecurityException 异常
但是我们可以通过反射获取Unsafe的实例
public static Unsafe getUnsafe() {
try {
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
return (Unsafe)f.get(null);
} catch (Exception e) {
/* ... */
}
}
看Future.java源码是如何使用Unsafe的
private volatile int state;
private volatile Thread runner;
private volatile WaitNode waiters;
// Unsafe mechanics
private static final sun.misc.Unsafe UNSAFE;
private static final long stateOffset;
private static final long runnerOffset;
private static final long waitersOffset;
static {
try {
// 获取UNSAFE 的实例
UNSAFE = sun.misc.Unsafe.getUnsafe();
Class> k = FutureTask.class;
// 获取state字段的偏移量
stateOffset = UNSAFE.objectFieldOffset
(k.getDeclaredField("state"));
runnerOffset = UNSAFE.objectFieldOffset
(k.getDeclaredField("runner"));
waitersOffset = UNSAFE.objectFieldOffset
(k.getDeclaredField("waiters"));
} catch (Exception e) {
throw new Error(e);
}
}
一些有用的api:
1、objectFieldOffset:获取指定的对象实例变量在对象内存中的偏移量
long stateOffset = UNSAFE.objectFieldOffset
(FutureTask.class.getDeclaredField("state"));
2、compareAndSwapInt:通过比较并替换的机制,修改指定偏移量内存的值
判断内存值stateOffset和期望值expectValue是否一致,一致就修改为新值newValue并返回true,不一致就返回false
UNSAFE.compareAndSwapInt(this, stateOffset, expectValue, newValue)
3、park:使当前线程睡眠
// LockSupport工具类
LockSupport.park(this);
LockSupport.parkNanos(this, nanos);
public static void park(Object blocker) {
Thread t = Thread.currentThread();
setBlocker(t, blocker);
UNSAFE.park(false, 0L);
setBlocker(t, null);
}
4、unpark:唤醒某个睡眠线程
LockSupport.unpark(thread);
public static void unpark(Thread thread) {
if (thread != null)
UNSAFE.unpark(thread);
}
CAS:
CAS(Compare and Swap),即比较并替换,实现并发算法时常用到的一种技术,Doug lea大神在java同步器中大量使用了CAS技术,鬼斧神工的实现了多线程执行的安全性。
CAS的思想很简单:三个参数,一个当前内存值V、旧的预期值A、即将更新的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做,并返回false。
缺点:
CAS存在一个很明显的问题,即ABA问题。
如果变量V初次读取的时候是A,并且在准备赋值的时候检查到它仍然是A,那能说明它的值没有被其他线程修改过了吗?
如果在这段期间曾经被改成B,然后又改回A,那CAS操作就会误认为它从来没有被修改过。针对这种情况,java并发包中提供了一个带有标记的原子引用类AtomicStampedReference,它可以通过控制变量值的版本来保证CAS的正确性。
java unsafe cas_java并发Unsafe和CAS相关推荐
- java sychronized cas_Java并发(4)- synchronized与CAS
引言 上一篇文章中我们说过,volatile通过lock指令保证了可见性.有序性以及"部分"原子性.但在大部分并发问题中,都需要保证操作的原子性,volatile并不具有该功能,这 ...
- java原子操作cas_java并发编程系列二:原子操作/CAS
什么是原子操作 不可被中断的一个或者一系列操作 实现原子操作的方式 Java可以通过锁和循环CAS的方式实现原子操作 CAS( Compare And Swap ) 为什么要有CAS? Compar ...
- java 时间戳_Java并发编程之CAS三CAS的缺点 及解决办法
Java并发编程之CAS第三篇-CAS的缺点 通过前两篇的文章介绍,我们知道了CAS是什么以及查看源码了解CAS原理.那么在多线程并发环境中,的缺点是什么呢?这篇文章我们就来讨论讨论 本篇是<凯 ...
- 死磕Java并发:深入分析CAS
作者:chenssy 来源:Java技术驿站公众号 CAS,Compare And Swap,即比较并交换.Doug lea大神在同步组件中大量使用CAS技术鬼斧神工地实现了Java多线程的并发操作. ...
- JDK Unsafe类的使用与CAS原子特性
JDK Unsafe类的使用与CAS原子特性 Java.util.concurrent.atomic包,其中包含了大量使用到Unsafe这个类 Java不能直接访问操作系统的底层,而是通过本地方法来访 ...
- Java魔法类:Unsafe应用解析
Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别.不安全操作的方法,如直接访问系统内存资源.自主管理内存资源等,这些方法在提升Java运行效率.增强Java语言底层资源操作能 ...
- 【基本功】Java魔法类:Unsafe应用解析
总第334篇 2019年 第12篇 大家好,我是程序员鼓励师美美- <基本功>专栏又上新了:Java中的Unsafe类在提升运行效率.增强底层资源操作能力方面有很大的用处.但如果在开发过程 ...
- 字体对话框java实验_Java Web安全 || Java基础 sun.misc.Unsafe
点击上方"凌天实验室","星标或置顶公众号" 漏洞.技术还是其他,我都想第一时间和你分享 " [历史]已连载更新全部内容:[菜单栏]-[JAVA SE ...
- java unsafe 详解_死磕 java魔法类之Unsafe解析
问题 (1)Unsafe是什么? (2)Unsafe具有哪些功能? (3)Unsafe为什么是不安全的? (4)怎么使用Unsafe? 简介 本章是java并发包专题的第一章,但是第一篇写的却不是ja ...
- Java并发编程之CAS第三篇-CAS的缺点
Java并发编程之CAS第三篇-CAS的缺点 通过前两篇的文章介绍,我们知道了CAS是什么以及查看源码了解CAS原理.那么在多线程并发环境中,的缺点是什么呢?这篇文章我们就来讨论讨论 本篇是<凯 ...
最新文章
- 成长的速度一定要超过父母老去的速度
- 微信小程序开发第三弹
- 3D Computer Grapihcs Using OpenGL - 04 First Triangle
- android京东首页轮播代码,web移动端-轮播
- 在Linux和Windows的Docker容器中运行ASP.NET Core
- Tableau BI工具对接 AnalyticDB for PostgreSQL数据源
- tcxgrid主从结构显示多行_快速跟随型主从结构多电机同步控制
- 力扣 每日一题 丢失的数字
- Bailian2899 Bailian3242 矩阵交换行【矩阵】
- 【w3cschool】PHP语法简单复习
- 在tomcat中添加虚拟主机,myeclipse中整合jdk和tomcat
- Arduino ide配置esp32硬件支持(配置esp32的arduino开发环境)
- 【mmdetection】测试单张图像
- 解除外链屏蔽,对互联网行业意味着什么?
- iphone11文件连接服务器教程,新入手iPhone 11?手把手教你快速上手熟悉IOS系统
- 《X Cross:魔境传说》(X Cross)[DVDRip]
- T12焊台和JBC焊台自制资料(原理和电路)
- WDS+ADK+MDT部署
- uniapp引入vant
- python unittest框架_python unittest框架理解与总结
热门文章
- 讲师BLOG:http://linuxguest.blog.51cto.com/
- @Value 注入 map、List,yaml 格式
- 3 超链接_excel函数应用技巧:超链接函数HYPERLINK
- pyjion python3.6_Pyjion的代码质量一例 [20160221]
- python子类调用父类构造函数_Java 子类调用父类的构造函数
- LintCode—合并两个排序链表(165)
- 台湾“比基尼登山客”遗体运出 山友接其“回家”
- MySQL 修改字段类型或长度
- POJ 3083 Children of the Candy Corn(DFS + BFS)
- 2007年第一份成绩单——关于《WebWork in Action》中文版