打开文件管理器Device File Explorer
打开文件管理器Device File Explorer:
版本Android Studio3.2

什么是CAS
它是用在并发场合用来实现线程安全的一种算法,进行不可分割的原子操作。基本思想是:我认为value的值应该是A,如果是的话那我就把它改成B,如果不是A就说明已经被别人修改过了,那么我就不修改了,这就避免了并发情况下多人修改导致出错。
CAS有三个操作数:内存值V、预期值A、要求改的值B。当且仅当预期值A和内存值V相同时,才将内存值修改为B,否则什么都不做。最后返回现在的V值。
CPU的特殊指令:CAS实际上是要利用CPU的特殊指令,这些指令由CPU保证了他们的原子性,一个指令就可以做好几件事情,也不会出现线程安全问题。
案例
理解CAS的等价代码:
public class SimulatedCAS {
private volatile int value;
public synchronized int compareAndSwap(int expectedValue, int newValue) {
int oldValue = value;
if (oldValue == expectedValue) {
value = newValue;
}
return oldValue;
}
}
应用场景
CAS在juc包中的应用是很多的,既能保证安全性,又能提高性能,不需要去获取互斥同步锁。CAS的第一个应用就是乐观锁,还有并发容器,以及原子类。
以AtomicInteger为例,分析在Java中是如何利用CAS实现原子操作的
关于Java中是如何利用CAS实现原子操作:
AtomicInteger加载Unsafe工具,用来直接操作内存数据。
所以实际上是通过Unsafe来实现底层操作。
关于Unsafe类:
Unsafe是CAS的核心类。Java无法直接访问底层操作系统,而是通过本地native方法来访问。不过尽管如此,JVM还是开启了一个后门,JDK中的一个类Unsafe,提供了硬件级别的原子操作。
Unsafe代码中的objectFieldOffset方法获得的VALUE表示的是变量值在内存中的偏移地址,因为Unsafe就是根据内存偏移地址获取数据的原值的,这样我们就能通过Unsafe来实现CAS了。
并且还需要volatile修饰value字段,保证可见性。
getAndAddInt方法分析
public class AtomicInteger extends Number implements java.io.Serializable {
private static final jdk.internal.misc.Unsafe U = jdk.internal.misc.Unsafe.getUnsafe();
private static final long VALUE = U.objectFieldOffset(AtomicInteger.class, "value");
//这个静态变量会在最初被加载,
//VALUE则是用Unsafe的objectFieldOffset取得的,拿到的是AtomicInteger这个类中value字段的地址。
//而value正是用volatile修饰的
private volatile int value;
//省略。。。
//分析getAndAdd方法
public final int getAndAdd(int delta) {
//调用的是Unsafe的getAndAddInt方法
return U.getAndAddInt(this, VALUE, delta);
}
}
class Unsafe{
//省略。。。
@HotSpotIntrinsicCandidate
public final int getAndAddInt(Object o, long offset, int delta) {
int v;
do {
v = getIntVolatile(o, offset);
} while (!weakCompareAndSetInt(o, offset, v, v + delta));
//可以看到上面是一个dowhile循环
//而循环条件就调用了weakCompareAndSetInt,正是CAS的体现
return v;
}
@HotSpotIntrinsicCandidate
public final boolean weakCompareAndSetInt(Object o, long offset,
int expected,
int x) {
return compareAndSetInt(o, offset, expected, x);
}
//到这里已经是一个native方法了
//关于这个本地方法,它的C++代码的思路是,利用偏移量拿到原值地址,然后进行相应的CAS操作
@HotSpotIntrinsicCandidate
public final native boolean compareAndSetInt(Object o, long offset,
int expected,
int x);
}
总结
Unsafe方法中的compareAndSetInt方法想办法拿到变量value在内存中的地址。然后通过C++代码实现原子性比较和替换。
缺点
ABA问题
可以添加版本号解决。
自旋时间过长
打开文件管理器Device File Explorer的更多相关文章
- Android Studio 3.1.2 Device File Explorer nothing to show
Android Studio 3.1.2 Device File Explorer nothing to show 不显示 目录 ,空白 手持终端设备: Android 4.2.2 ,API1 ...
- win10 uwp 打开文件管理器选择文件
本文:让文件管理器选择文件,不是从文件管理器获得文件. 假如已经获得一些文件,那么如何从文件管理器选择这些文件? 使用方法很简单. 从网上拿图来说 打开文件夹自动选择所有文件 首先需要获得文件夹,因为 ...
- Linux中打开文件管理器的命令
在Mac中,我们可以使用open命令,在终端打开指定目录下的文件管理器,在Linux中,同样可以使用类似的命令:nautilus.
- Android的Device File Explorer刷新文件
不知道为什么,右键点sync不起作用,必须点一下列表中的设备,才可以.
- linux下命令行打开文件管理器
nautilus,这个太有用了,应为可以在secureCRT中使用,因为可以添加sudo来调用
- Ubuntu终端内打开文件管理器
本文首发于cartoon的博客 转载请注明出处:https://cartoonyu.github.io/cartoon-blog 近段时间在ubuntu中搭建jdk并在jdk的 ...
- DeepinV20系统文件管理器右键发送至为知笔记
1. 创作背景 昨天在深度系统上做了一个打开文件管理器选择文件右键发送文本至博客园的插件. 这个插件对于我自己来说是及其方便的东西,平时的学习积累,工作经验或者生活感悟,随手记下之后,就能够轻松发送出 ...
- 树莓派使用root操作图形界面使用自带的文件管理器
使用pi用户通过VNC登录图形界面之后,在需要修改一些文件则时提示权限不够, 命令行下使用sudo 运行就可以了.或者直接用root账户. 修改管理员密码:sudo passwd root 修改启用管 ...
- 2018-8-10-win10-uwp-打开文件管理器选择文件
title author date CreateTime categories win10 uwp 打开文件管理器选择文件 lindexi 2018-08-10 19:16:50 +0800 2018 ...
随机推荐
- MySQL操作之DML
目录 SQL语句的分类 DML语句 SQL语句的分类 DDL(Data Definition Languages)语句:数据定义语言.这些语句定义了不同的数据段. 数据库.表.列.索引等数据库对象的定 ...
- CentOS6.9安装MySQL(编译安装、二进制安装)
目录 CentOS6.9安装MySQL Linux安装MySQL的4种方式: 1. 二进制方式 特点:不需要安装,解压即可使用,不能定制功能 2. 编译安装 特点:可定制,安装慢 5.5之前: ./c ...
- 多年珍藏的55w御剑字典
御剑珍藏55w目录字典,很给力,放在以前直接数据库都能给跑出来. 用法:直接把放入配置文件的目录 链接:https://pan.baidu.com/s/1MGxdd9hH006Y7AO7CpkO8g ...
- 暴强贴:从.NET平台调用Win32 API----转载
水之真谛 关注 17人评论 27649人阅读 2007-02-28 17:03:47 作者:刘铁猛日期:2005-12-20关键字:C# .NET Win32 API 版权声明:本文章受知识产权法 ...
- Python中turtle绘图学习笔记和实例
一.既然本次讲的主角是turtle函数库,那肯定得先了解一下它是什么 turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位 ...
- jq的链式调用.end();
先上code <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- k-近邻算法python代码实现(非常全)
1.k近邻算法是学习机器学习算法最为经典和简单的算法,它是机器学习算法入门最好的算法之一,可以非常好并且快速地理解机器学习的算法的框架与应用.它是一种经典简单的分类算法,当然也可以用来解决回归问题.2 ...
- 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:instanceof关键字
class A{ // 定义类A public void fun1(){ // 定义fun1()方法 System.out.println("A --> public void fun ...
- poj 3617 Best Cow Line 贪心模拟
Best Cow Line Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42701 Accepted: 10911 D ...
- ffmpeg 学习:000-概述和库的组成
背景 ffmpeg bin工具 可能无法满足产品的使用,于是需要通过传参调用ffmpeg库,即在通过更底层的方式使用它. FFmpeg 介绍 FFmpeg是领先的多媒体框架,能够解码,编码,转码,复用 ...