`
leonzhx
  • 浏览: 786812 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Zz 并发中CAS的含义及Java中AtomicXXX类的分析

    博客分类:
  • Java
 
阅读更多

原文地址为: http://www.cnblogs.com/maxupeng/archive/2011/07/01/2096035.html

 

CAS是硬件CPU提供的元语,它的原理:我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。

Java并发库中的AtomicXXX类均是基于这个元语的实现,以AtomicInteger为例:

 public final int incrementAndGet() {
        for (;;) {
            int current = get();
            int next = current + 1;
            if (compareAndSet(current, next))
                return next;
        }
    }

    public final boolean compareAndSet(int expect, int update) {
    return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }
 

其中,unsafe.compareAndSwapInt()是一个native方法,正是调用CAS元语完成该操作。

===================================================

顺便说下volatile。

根据Java Language Specification中的说明, jvm系统中存在一个主内存(Main Memory或Java Heap Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。

每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。

所以,同一变量的值在工作内存和主存中可能不一致。volatile其实是告诉处理器, 不要将我放入工作内存, 请直接在主存操作我。

===================================================

回到AtomicInteger,注意到value的声明:

private volatile int value;
 

通过前面对volatile的介绍可以知道,直接对volatile的赋值和读取操作是无须加锁的,见源码:

  public final int get() {
return value;
}

public final void set(int newValue) {
value = newValue;
}
 

 

注意:volatile的这种作用对double和long无效,因为JVM中将对double或long的赋值或读取操作拆成2个32位数的操作。

===================================================

那么,为什么自增操作要通过CAS来完成呢?仔细观察incrementAndGet()方法,发现自增操作其实拆成了两步完成的:

int current = get();
int next = current + 1;
 

由于valatile只能保证读取或写入的是最新值,那么可能出现以下情况:

1 A线程执行get()操作,获取current值(假设为1)

2 B线程执行get()操作,获取current值(为1)

3 B线程执行next = current + 1操作,next = 2

4 A线程执行next = current + 1操作,next = 2

这样的结果明显不是我们想要的,所以,自增操作必须采用CAS来完成。

分享到:
评论

相关推荐

    阿里巴巴java笔试zz.

    以上问题主要涉及逻辑推理、决策分析、问题解决等软技能,这些技能在Java开发中也是不可或缺的,比如在解决编程难题、设计算法、分析用户需求等方面都需要用到。虽然题目本身不直接测试Java编程技术,但这些能力是...

    base zz zz zz zz

    base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz

    Zz: java 线程池设计思想

    本文将深入探讨Java线程池的设计原理、核心组件以及如何在实际开发中合理使用。 线程池的实现主要依赖于Java的`java.util.concurrent`包中的`ExecutorService`接口和`ThreadPoolExecutor`类。`ExecutorService`是...

    (zz)java集合类总结

    本文将对Java标准类库中的集合类进行系统性的总结与分析。 #### 一、Java集合框架概览 Java集合框架主要包括三种主要类型的容器:`List`、`Set` 和 `Map`,以及一些辅助接口和类。这些容器提供了存储和操作对象的...

    zz牌类小游戏24点

    "zz牌类小游戏24点" 是一个基于Java编程语言开发的桌面游戏,其核心玩法是24点游戏。24点游戏是一种流行的心算游戏,玩家需要利用四张给出的扑克牌上的数字,通过加、减、乘、除运算,使得结果等于24。这个游戏旨在...

    zz.rar_JAVA俄罗斯方块

    本项目“zz.rar_JAVA俄罗斯方块”提供了一套完整的JAVA源代码,让开发者可以深入理解如何用JAVA语言实现这个经典游戏。本文将详细解析该项目中的关键知识点,帮助读者更好地理解和掌握JAVA编程技巧。 1. **JAVA基础...

    聊天工具的java开发 超越QQ 天翔ZZ

    本文将深入探讨使用Java语言开发聊天工具的关键知识点,结合"天翔ZZ"这个项目,我们将分析服务器程序和客户端程序的设计与实现。 首先,Java作为跨平台的编程语言,因其强大的网络编程能力而成为开发聊天工具的理想...

    java中四个核心思想

    Java中的类装载器采用了一种层次化的体系结构,主要包括以下几种类型的装载器: - **启动类装载器(Bootstrap Class Loader)**:这是系统级的类装载器,用于装载Java的核心类库,如`java.lang.*`等,它是所有其他类...

    Java语言基础入门教程 Java实训教程 14.嵌套类等 共34页.pptx

    《Java语言基础入门教程》中的第14章主要介绍了嵌套类的相关概念及其使用方法。本章旨在通过详细的解析帮助读者理解和掌握嵌套类的基础知识以及如何在实际编程中应用这些知识。 #### 二、知识点概览 ##### 2.1 ...

    Aspose.cad19.5+dwg使用Java转pdf

    在Java项目中,你可以通过Maven或Gradle等构建工具添加依赖,或者直接将jar包添加到项目的类路径中。 下面是一个简单的Java代码示例,展示了如何使用Aspose.cad进行DWG到PDF的转换: ```java import ...

    nginx集成cas登录

    目前此脚本的技术架构为nginx+lua,实现的是casclient方式,其中功能包括sso登录拦截,查询用户信息以及用户登出功能。 文章也帮助简单普及了一下cas的多种登录方式以及部分画图说明。 在使用此脚本之前,需要了解的...

    java实现logistic回归算法

    在Java中,你可以先定义一个数据类,然后创建一个LogisticRegression类,包含初始化、训练、预测等方法。训练过程中,你需要实现梯度上升法或优化算法,每次迭代更新权重。预测时,使用Sigmoid函数计算概率并根据...

    Java图形界面学生签到考勤系统MySQL数据库.zip

    在Java中,我们通常使用JDBC(Java Database Connectivity)API来与MySQL建立连接,执行SQL查询和事务处理。系统需要设计合理的数据表结构,如“学生信息表”、“考勤记录表”等,以便存储和检索考勤数据。 3. **...

    zz-deprecated-wunder-java2:官方Wunderlist API的Java库

    【标题】"zz-deprecated-wunder-java2"指的是一个针对官方Wunderlist API的Java库,主要用于帮助开发者在Java环境中与Wunderlist服务进行交互。"deprecated"这个词表明这个库可能已经不再推荐使用,可能有更新的替代...

    JAVA源码Java火影忍者游戏源代码

    接下来,我们将详细分析并总结出与该标题、描述及部分内容相关的知识点。 ### Java编程语言 Java是一种广泛使用的高级编程语言,它具有平台无关性、面向对象、健壮性等特点。在游戏开发领域,Java因其良好的跨平台...

    JAVA源码Java3D魔方游戏源码及中文注释包

    ### JAVA源码Java 3D魔方游戏源码及中文注释包 #### 知识点一:Java 3D技术概述 Java 3D API 是一个用于开发和执行基于三维图形的应用程序或applet的标准Java类库。该API允许开发者创建复杂的3D场景,并在这些场景...

    Java课程设计 介绍及代码

    3. **异常处理**:了解Java中的try-catch-finally语句块,学会如何捕获和处理程序运行时可能出现的错误。 4. **集合框架**:熟悉ArrayList、LinkedList、HashMap等常用集合类的使用,以及如何操作和遍历它们。 5. ...

    JAVA源码Java中的Blowfish对称密钥加密算法类和实例

    ### JAVA源码:Java中的Blowfish对称密钥加密算法类和实例 #### Blowfish对称密钥加密算法概述 Blowfish是一种快速、高效且安全的对称密钥块加密算法,由著名密码学家布鲁斯·施奈尔(Bruce Schneier)于1993年...

    JAVA源码用Java加密类实现DES,RSA及SHA的加密算法

    ### JAVA源码用Java加密类实现DES、RSA及SHA的加密算法 在现代软件开发过程中,数据的安全性显得尤为重要。为了确保数据传输过程中的安全,加密技术被广泛应用。本篇文章将详细探讨如何利用Java源码中的加密类实现...

    超出NLO QCD的高横向动量的ZZ产生

    然后,我们为两种实验设置提供了差分分布的结果,一种用于搜索异常三重玻色子玻色子耦合,另一种用于希格斯分析中的四个带电轻子最终状态通道。 我们发现,近似的NNLO校正量很大,在Z玻色子或前轻子的高横向动量下...

Global site tag (gtag.js) - Google Analytics