打开文件管理器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的更多相关文章

  1. 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 ...

  2. win10 uwp 打开文件管理器选择文件

    本文:让文件管理器选择文件,不是从文件管理器获得文件. 假如已经获得一些文件,那么如何从文件管理器选择这些文件? 使用方法很简单. 从网上拿图来说 打开文件夹自动选择所有文件 首先需要获得文件夹,因为 ...

  3. Linux中打开文件管理器的命令

    在Mac中,我们可以使用open命令,在终端打开指定目录下的文件管理器,在Linux中,同样可以使用类似的命令:nautilus.

  4. Android的Device File Explorer刷新文件

    不知道为什么,右键点sync不起作用,必须点一下列表中的设备,才可以.

  5. linux下命令行打开文件管理器

    nautilus,这个太有用了,应为可以在secureCRT中使用,因为可以添加sudo来调用

  6. Ubuntu终端内打开文件管理器

        本文首发于cartoon的博客     转载请注明出处:https://cartoonyu.github.io/cartoon-blog     近段时间在ubuntu中搭建jdk并在jdk的 ...

  7. DeepinV20系统文件管理器右键发送至为知笔记

    1. 创作背景 昨天在深度系统上做了一个打开文件管理器选择文件右键发送文本至博客园的插件. 这个插件对于我自己来说是及其方便的东西,平时的学习积累,工作经验或者生活感悟,随手记下之后,就能够轻松发送出 ...

  8. 树莓派使用root操作图形界面使用自带的文件管理器

    使用pi用户通过VNC登录图形界面之后,在需要修改一些文件则时提示权限不够, 命令行下使用sudo 运行就可以了.或者直接用root账户. 修改管理员密码:sudo passwd root 修改启用管 ...

  9. 2018-8-10-win10-uwp-打开文件管理器选择文件

    title author date CreateTime categories win10 uwp 打开文件管理器选择文件 lindexi 2018-08-10 19:16:50 +0800 2018 ...

随机推荐

  1. vue项目真机测试

    1.在项目中重启命令行运行ipconfig(如果是ios系统运行ifconfig)获取到项目在本机运行的ip地址 2.在项目的package.json中修改允许访问ip地址(--host 0.0.0. ...

  2. Windows 网络显示监视器软件_spacedesk

    将各种设备拓展为 Windows 第二屏幕 官方网站 https://spacedesk.net/ 使用教程参阅: https://blog.csdn.net/sinat_21902709/artic ...

  3. token和session的区别

    session和token都是用来保持会话,功能相同 一.session机制,原理 session是服务端存储的一个对象,主要用来存储所有访问过该服务端的客户端的用户信息(也可以存储其他信息),从而实 ...

  4. jmeter分布式linux负载机,windows主控机

    1.将参数化文件上传到linux服务器,放在linux上jmeter的bin路径下 2.设置server.rmi.ssl.disable=true 分别修改主控机和负载机的jmeter.propert ...

  5. MFC CListCtrl 显示bmp图片

    m_ListCtrl.SetExtendedStyle(m_ListCtrl.GetExtendedStyle()| LVS_EX_SUBITEMIMAGES | LVS_EX_GRIDLINES); ...

  6. 「NOI2015」荷马史诗

    传送门 Luogu 解题思路 \(k\) 叉 \(\text{Huffman}\) 树板子题,至于最长串最短,只要同样权值的优先考虑深度小的就好了. 细节注意事项 咕咕咕 参考代码 #include ...

  7. js获取cookie提取用户名asp.net+html

    JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的. 而cookie是运行在客户端的,所以可以用JS来设置cookie. 假设有这样一 ...

  8. POJ 3669 Meteor Shower BFS求最小时间

    Meteor Shower Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 31358   Accepted: 8064 De ...

  9. 如何看Analysis分析图

    第一步,从分析Summary的事务执行情况入手. Summary主要是判定事务的响应时间与执行情况是否合理.如果发现问题,则需要作进一步分析.通常情况下,如果事务执行情况失败或者响应时间过长等,都需要 ...

  10. Jmeter测试入门——带token的http请求

    安装 官网下载地址:http://jmeter.apache.org/download_jmeter.cgi 下载完成后解压zip包 启动JMeter,双击JMeter解压路径bin下面的jmeter ...