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相关推荐

  1. java sychronized cas_Java并发(4)- synchronized与CAS

    引言 上一篇文章中我们说过,volatile通过lock指令保证了可见性.有序性以及"部分"原子性.但在大部分并发问题中,都需要保证操作的原子性,volatile并不具有该功能,这 ...

  2. java原子操作cas_java并发编程系列二:原子操作/CAS

    什么是原子操作 不可被中断的一个或者一系列操作 实现原子操作的方式 Java可以通过锁和循环CAS的方式实现原子操作 CAS( Compare And Swap )  为什么要有CAS? Compar ...

  3. java 时间戳_Java并发编程之CAS三CAS的缺点 及解决办法

    Java并发编程之CAS第三篇-CAS的缺点 通过前两篇的文章介绍,我们知道了CAS是什么以及查看源码了解CAS原理.那么在多线程并发环境中,的缺点是什么呢?这篇文章我们就来讨论讨论 本篇是<凯 ...

  4. 死磕Java并发:深入分析CAS

    作者:chenssy 来源:Java技术驿站公众号 CAS,Compare And Swap,即比较并交换.Doug lea大神在同步组件中大量使用CAS技术鬼斧神工地实现了Java多线程的并发操作. ...

  5. JDK Unsafe类的使用与CAS原子特性

    JDK Unsafe类的使用与CAS原子特性 Java.util.concurrent.atomic包,其中包含了大量使用到Unsafe这个类 Java不能直接访问操作系统的底层,而是通过本地方法来访 ...

  6. Java魔法类:Unsafe应用解析

    Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别.不安全操作的方法,如直接访问系统内存资源.自主管理内存资源等,这些方法在提升Java运行效率.增强Java语言底层资源操作能 ...

  7. 【基本功】Java魔法类:Unsafe应用解析

    总第334篇 2019年 第12篇 大家好,我是程序员鼓励师美美- <基本功>专栏又上新了:Java中的Unsafe类在提升运行效率.增强底层资源操作能力方面有很大的用处.但如果在开发过程 ...

  8. 字体对话框java实验_Java Web安全 || Java基础 sun.misc.Unsafe

    点击上方"凌天实验室","星标或置顶公众号" 漏洞.技术还是其他,我都想第一时间和你分享 " [历史]已连载更新全部内容:[菜单栏]-[JAVA SE ...

  9. java unsafe 详解_死磕 java魔法类之Unsafe解析

    问题 (1)Unsafe是什么? (2)Unsafe具有哪些功能? (3)Unsafe为什么是不安全的? (4)怎么使用Unsafe? 简介 本章是java并发包专题的第一章,但是第一篇写的却不是ja ...

  10. Java并发编程之CAS第三篇-CAS的缺点

    Java并发编程之CAS第三篇-CAS的缺点 通过前两篇的文章介绍,我们知道了CAS是什么以及查看源码了解CAS原理.那么在多线程并发环境中,的缺点是什么呢?这篇文章我们就来讨论讨论 本篇是<凯 ...

最新文章

  1. 成长的速度一定要超过父母老去的速度
  2. 微信小程序开发第三弹
  3. 3D Computer Grapihcs Using OpenGL - 04 First Triangle
  4. android京东首页轮播代码,web移动端-轮播
  5. 在Linux和Windows的Docker容器中运行ASP.NET Core
  6. Tableau BI工具对接 AnalyticDB for PostgreSQL数据源
  7. tcxgrid主从结构显示多行_快速跟随型主从结构多电机同步控制
  8. 力扣 每日一题 丢失的数字
  9. Bailian2899 Bailian3242 矩阵交换行【矩阵】
  10. 【w3cschool】PHP语法简单复习
  11. 在tomcat中添加虚拟主机,myeclipse中整合jdk和tomcat
  12. Arduino ide配置esp32硬件支持(配置esp32的arduino开发环境)
  13. 【mmdetection】测试单张图像
  14. 解除外链屏蔽,对互联网行业意味着什么?
  15. iphone11文件连接服务器教程,新入手iPhone 11?手把手教你快速上手熟悉IOS系统
  16. 《X Cross:魔境传说》(X Cross)[DVDRip]
  17. T12焊台和JBC焊台自制资料(原理和电路)
  18. WDS+ADK+MDT部署
  19. uniapp引入vant
  20. python unittest框架_python unittest框架理解与总结

热门文章

  1. 讲师BLOG:http://linuxguest.blog.51cto.com/
  2. @Value 注入 map、List,yaml 格式
  3. 3 超链接_excel函数应用技巧:超链接函数HYPERLINK
  4. pyjion python3.6_Pyjion的代码质量一例 [20160221]
  5. python子类调用父类构造函数_Java 子类调用父类的构造函数
  6. LintCode—合并两个排序链表(165)
  7. 台湾“比基尼登山客”遗体运出 山友接其“回家”
  8. MySQL 修改字段类型或长度
  9. POJ 3083 Children of the Candy Corn(DFS + BFS)
  10. 2007年第一份成绩单——关于《WebWork in Action》中文版