- 浏览: 798992 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (651)
- Java (39)
- Java 初学者小问题 (66)
- 设计模式 (7)
- 项目管理 (3)
- 数据库 (1)
- 算法 (2)
- Java practices (6)
- Effective Java2读书笔记 (78)
- Linux (2)
- programming ruby 读书笔记 (5)
- Core Java Ninth Edition Volume I 读书笔记 (15)
- Pro Git 读书笔记 (12)
- Git (3)
- Maven in Action 读书笔记 (20)
- Web (12)
- 非技术类书籍 (11)
- 电影 (40)
- Web Cache (1)
- jquery (0)
- 历史 (4)
- Dive Into HTML5 读书笔记 (13)
- 三国演义小学毕业考 (79)
- 高效能人士的7个习惯 读书笔记 (12)
- Java Performance 读书笔记 (3)
- Protocol Buffer 学习笔记 (6)
- Mongo DB 学习笔记 (7)
- Morphia 学习笔记 (7)
- Algorithms -- Princeton 学习笔记 (13)
- String研究 (10)
- Hadoop: The Definitive Guide 读书笔记 (3)
- Java与模式读书笔记 (5)
- Date研究 (3)
- The Roman Empire 听课笔记 (4)
- Algorithms -- Standford 学习笔记 (16)
- Core Java Ninth Edition Volume II 读书笔记 (9)
- Thinking in Java 4th Edition 读书笔记 (21)
- Node : Up and Running 学习笔记 (5)
- Eloquent Javascript (8)
- Smashing Node.js 读书笔记 (1)
- Algorithms II -- Standford 学习笔记 (19)
- Algorithm II -- Princeton 学习笔记 (14)
- 网络安全 (2)
- Javascript (4)
- 正则表达式 (1)
- JAVA 7/8 (15)
- JVM (10)
- NodeJS (1)
- 鸟哥的linux私房菜读书笔记 (14)
- Web Service (1)
- The art of programming (9)
- Introduction to Algorithm 读书笔记 (4)
- Java 源码阅读 (0)
- Spring in Action 读书笔记 (2)
- Java Network Programming 读书笔记 (2)
最新评论
-
心存高远:
谢谢作者分享,刚好看到这里不太明白,现在茅塞顿开。不过runt ...
关于 Maven的传递依赖的理解 -
sxlkk:
851228082 写道甚至在某次技术会议现场遇到《Maven ...
关于 Maven的传递依赖的理解 -
851228082:
851228082 写道a----compile----b-- ...
第五章 坐标和依赖 -
851228082:
a----compile----b-----provided- ...
第五章 坐标和依赖 -
851228082:
甚至在某次技术会议现场遇到《Maven in action》的 ...
关于 Maven的传递依赖的理解
原文地址为: 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来完成。
发表评论
-
Zz The java.lang.LinkageError: loader constraint violation" demystified
2014-05-13 19:24 1527http://frankkieviet.blogspot.c ... -
zz Java NIO 系列教程
2014-05-09 22:38 1166http://www.iteye.com/magazines ... -
Zz Java NIO Tutorial
2014-05-09 22:34 1791http://tutorials.jenkov.com/ja ... -
Zz Spring IOC 好处和劣势
2014-03-28 18:06 1080IoC是什么? Inversion of Contro ... -
Zz ConcurrentHashMap源码解析
2014-03-16 17:29 672ConcurrentHashMap是Java 5中支持高并发 ... -
Zz Java多线程之ConcurrentHashMap深入分析
2014-03-16 14:50 1185一、Map体系 Hashtable是JDK ... -
Zz ConcurrentHashMap原理分析
2014-03-16 14:03 1129集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合 ... -
Zz Java并发编程之ConcurrentHashMap
2014-03-16 13:40 2071ConcurrentHashMap Concurrent ... -
关于ConcurrentHashMap 中位移的问题
2014-03-16 14:33 1266拜读了GoldenDoc的大作:《Java并发编程之Con ... -
ConcurrentHashMap 详解
2014-03-15 21:19 01. ConcurrentHashMap 可以做到读取数 ... -
Why java Arrays use two different sort algorithms for different types?
2014-02-25 22:09 1309Java 7 uses Dual-Pivot Quicks ... -
深入探讨 java.lang.ref 包
2014-02-25 19:58 1095回顾了一下三年多前写的文章https://www.i ... -
Zz Java 中使用内存映射文件需要考虑的 10 个问题
2014-02-09 17:18 949java中的内存映射IO和内存映射文件是什么? 内存 ... -
Zz 10 Things to Know about Memory Mapped File in Java
2014-02-09 17:16 635What is Memory Mapped File ... -
Zz Direct vs non-direct ByteBuffer
2014-02-08 12:46 851先解释一下两者的区 ... -
Zz direct buffer VS non-direct buffer
2014-02-08 10:55 872在java NIO中,有两种不同的buffer:direct ... -
Java Generics 小结
2013-03-07 14:12 01. 泛型类型或泛型类 ... -
关于 Java正则表达式中的Possessive数量修饰词的理解
2013-02-26 21:14 1287正则表达式对于数量限定符如 ?, + , *, {n, m ... -
Run Application in debug mode
2013-01-23 13:59 1317Q: I use the Eclipse IDE to de ... -
一个 Dynamic Proxy 的例子
2012-11-22 11:18 1237最近翻出了两年前老吴让我写的一个MockFacotry , ...
相关推荐
该项目为“studyjava-zz”设计源码,深入探索Java编程新视野,共计包含549个文件,涵盖209个Java源代码文件、74个Git忽略文件、70个项目配置文件、68个classpath文件、66个偏好设置文件、25个Markdown文档、16个XML...
在技术面试中,编程知识的考察自然是核心内容,但企业也越来越注重求职者所具备的软技能,尤其是逻辑推理、决策分析与问题解决等能力。阿里巴巴的Java笔试题尤为注重这一点,即使部分题目与直接的编程技能无直接关联...
base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz
本文将深入探讨Java线程池的设计原理、核心组件以及如何在实际开发中合理使用。 线程池的实现主要依赖于Java的`java.util.concurrent`包中的`ExecutorService`接口和`ThreadPoolExecutor`类。`ExecutorService`是...
本文将对Java标准类库中的集合类进行系统性的总结与分析。 #### 一、Java集合框架概览 Java集合框架主要包括三种主要类型的容器:`List`、`Set` 和 `Map`,以及一些辅助接口和类。这些容器提供了存储和操作对象的...
"zz牌类小游戏24点" 是一个基于Java编程语言开发的桌面游戏,其核心玩法是24点游戏。24点游戏是一种流行的心算游戏,玩家需要利用四张给出的扑克牌上的数字,通过加、减、乘、除运算,使得结果等于24。这个游戏旨在...
本项目“zz.rar_JAVA俄罗斯方块”提供了一套完整的JAVA源代码,让开发者可以深入理解如何用JAVA语言实现这个经典游戏。本文将详细解析该项目中的关键知识点,帮助读者更好地理解和掌握JAVA编程技巧。 1. **JAVA基础...
本文将深入探讨使用Java语言开发聊天工具的关键知识点,结合"天翔ZZ"这个项目,我们将分析服务器程序和客户端程序的设计与实现。 首先,Java作为跨平台的编程语言,因其强大的网络编程能力而成为开发聊天工具的理想...
Java中的类装载器采用了一种层次化的体系结构,主要包括以下几种类型的装载器: - **启动类装载器(Bootstrap Class Loader)**:这是系统级的类装载器,用于装载Java的核心类库,如`java.lang.*`等,它是所有其他类...
《Java语言基础入门教程》中的第14章主要介绍了嵌套类的相关概念及其使用方法。本章旨在通过详细的解析帮助读者理解和掌握嵌套类的基础知识以及如何在实际编程中应用这些知识。 #### 二、知识点概览 ##### 2.1 ...
目前此脚本的技术架构为nginx+lua,实现的是casclient方式,其中功能包括sso登录拦截,查询用户信息以及用户登出功能。 文章也帮助简单普及了一下cas的多种登录方式以及部分画图说明。 在使用此脚本之前,需要了解的...
在Java项目中,你可以通过Maven或Gradle等构建工具添加依赖,或者直接将jar包添加到项目的类路径中。 下面是一个简单的Java代码示例,展示了如何使用Aspose.cad进行DWG到PDF的转换: ```java import ...
在Java中,你可以先定义一个数据类,然后创建一个LogisticRegression类,包含初始化、训练、预测等方法。训练过程中,你需要实现梯度上升法或优化算法,每次迭代更新权重。预测时,使用Sigmoid函数计算概率并根据...
在Java中,我们通常使用JDBC(Java Database Connectivity)API来与MySQL建立连接,执行SQL查询和事务处理。系统需要设计合理的数据表结构,如“学生信息表”、“考勤记录表”等,以便存储和检索考勤数据。 3. **...
【标题】"zz-deprecated-wunder-java2"指的是一个针对官方Wunderlist API的Java库,主要用于帮助开发者在Java环境中与Wunderlist服务进行交互。"deprecated"这个词表明这个库可能已经不再推荐使用,可能有更新的替代...
接下来,我们将详细分析并总结出与该标题、描述及部分内容相关的知识点。 ### Java编程语言 Java是一种广泛使用的高级编程语言,它具有平台无关性、面向对象、健壮性等特点。在游戏开发领域,Java因其良好的跨平台...
Java中有Swing和JavaFX两种主要的GUI框架可供选择。 ### 3. 百度网盘分享地址 根据描述中的信息,“JAVA源码lobby(经典board游戏Domination)”的获取方式是通过百度网盘分享地址。这意味着开发者可以通过该链接下载...
标题中的"ZZ_MODIFIED_GEEBINF.ENS.zip"是一个压缩包文件,暗示其内容可能包含对EndNote引用样式的一种修改。EndNote是一款流行的参考文献管理软件,它允许用户存储、组织和格式化引用文献。"ZZ_MODIFIED_GEEBINF....
### JAVA源码Java 3D魔方游戏源码及中文注释包 #### 知识点一:Java 3D技术概述 Java 3D API 是一个用于开发和执行基于三维图形的应用程序或applet的标准Java类库。该API允许开发者创建复杂的3D场景,并在这些场景...
3. **异常处理**:了解Java中的try-catch-finally语句块,学会如何捕获和处理程序运行时可能出现的错误。 4. **集合框架**:熟悉ArrayList、LinkedList、HashMap等常用集合类的使用,以及如何操作和遍历它们。 5. ...