<%@ page contentType="text/html; charset=gb2312"%> JAVA高级:多核线程-volatile原理与技巧
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
JAVA高级:多核线程-volatile原理与技巧
     发布者: 发布时间:2007-12-10
为什么使用volatile比同步代价更低?
同步的代价, 主要由其覆盖范围决定, 如果可以降低同步的覆盖范围, 则可以大幅提升程序性能.

而volatile的覆盖范围仅仅变量级别的. 因此它的同步代价很低.

volatile原理是什么?
volatile的语义, 其实是告诉处理器, 不要将我放入工作内存, 请直接在主存操作我.(工作内存详见java内存模型)

因此, 当多核或多线程在访问该变量时, 都将直接
操作主存, 这从本质上, 做到了变量共享.

volatile的有什么优势?
1, 更大的程序吞吐量
2, 更少的代码实现多线程
3, 程序的伸缩性较好
4, 比较好理解, 无需太高的学习成本

volatile有什么劣势?
1, 容易出问题
2, 比较难设计



volatile运算存在脏数据问题

volatile仅仅能保证变量可见性, 无法保证原子性.

volatile的race condition示例:

public class TestRaceCondition {
private volatile int i = 0;

public void increase() {
i++;
}

public int getValue() {
return i;
}
}
当多线程执行increase方法时, 是否能保证它的值会是线性递增的呢?
答案是否定的.

原因:
这里的increase方法, 执行的操作是i++, 即 i = i + 1;
针对i = i + 1, 在多线程中的运算, 本身需要改变i的值.
如果, 在i已从内存中取到最新值, 但未与1进行运算, 此时其他线程已数次将运算结果赋值给i.
则当前线程结束时, 之前的数次运算结果都将被覆盖.

即, 执行100次increase, 可能结果是 < 100.
一般来说, 这种情况需要较高的压力与并发情况下, 才会出现.

如何避免这种情况?
解决以上问题的方法:
一种是 操作时, 加上同步.
这种方法, 无疑将大大降低程序性能, 且违背了volatile的初衷.

第二种方式是, 使用硬件原语(CAS), 实现非阻塞算法
从CPU原语上, 支持变量级别的低开销同步.


CPU原语-比较并交换(CompareAndSet),实现非阻塞算法

什么是CAS?
cas是现代CPU提供给并发程序使用的原语操作. 不同的CPU有不同的使用规范.

在 Intel 处理器中,比较并交换通过指令的 cmpxchg 系列实现。
PowerPC 处理器有一对名为“加载并保留”和“条件存储”的指令,它们实现相同的目地;
MIPS 与 PowerPC 处理器相似,除了第一个指令称为“加载链接”。


CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)

什么是非阻塞算法?
一个线程的失败或挂起不应该影响其他线程的失败或挂起.这类算法称之为非阻塞(nonblocking)算法

对比阻塞算法:
如果有一类并发操作, 其中一个线程优先得到对象监视器的锁, 当其他线程到达同步边界时, 就会被阻塞.
直到前一个线程释放掉锁后, 才可以继续竞争对象锁.(当然,这里的竞争也可是公平的, 按先来后到的次序)


CAS 原理:

我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。



CAS使用示例(jdk 1.5 并发包 AtomicInteger类分析

/**
* Atomically sets to the given value and returns the old value.
*
* @param newValue the new value
* @return the previous value
*/ public final int getAndSet(int newValue) {
for (;;) {
int current = get();
if (compareAndSet(current, newValue))
return current;
}
}

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

这个方法是, AtomicInteger类的常用方法, 作用是, 将变量设置为指定值, 并返回设置前的值.
它利用了cpu原语compareAndSet来保障值的唯一性.

另, AtomicInteger类中, 其他的实用方法, 也是基于同样的实现方式.
比如 getAndIncrement, getAndDecrement, getAndAdd等等.

CAS语义上存在的"
ABA 问题"

什么是ABA问题?
假设, 第一次读取V地址的A值, 然后通过CAS来判断V地址的值是否仍旧为A, 如果是, 就将B的值写入V地址,覆盖A值.

但是, 语义上, 有一个漏洞, 当第一次读取V的A值, 此时, 内存V的值变为B值, 然后在未执行CAS前, 又变回了A值.
此时, CAS再执行时, 会判断其正确的, 并进行赋值.

这种判断值的方式来断定内存是否被修改过, 针对某些问题, 是不适用的.

为了解决这种问题, jdk 1.5并发包提供了AtomicStampedReference(有标记的原子引用)类, 通过控制变量值的版本来保证CAS正确性.

其实, 大部分通过值的变化来CAS, 已经够用了.


jdk1.5原子包介绍(基于volatile)
包的特色:
1, 普通原子数值类型AtomicInteger, AtomicLong提供一些原子操作的加减运算.

2, 使用了解决脏数据问题的经典模式-"比对后设定", 即 查看主存中数据是否与预期提供的值一致,如果一致,才更新.

3, 使用AtomicReference可以实现对所有对象的原子引用及赋值.包括Double与Float,
但不包括对其的计算.浮点的计算,只能依靠同步关键字或Lock接口来实现了.

4, 对数组元素里的对象,符合以上特点的, 也可采用原子操作.包里提供了一些数组原子操作类
AtomicIntegerArray, AtomicLongArray等等.

5, 大幅度提升系统吞吐量及性能.

TAG:
线程



(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
JAVA中具有实例缓存的不可变类
深入探讨、理解Java的CLASSPATH
JAVA基础知识精华总结
JSP、Struts避免Form重复提交的几种方案
Java语言中的ClassLoader与Package机制
WSDL 版本 1.1 规范
 
最近评论:
        
瓷嘴
天虹纯水设备公司是知名品牌纯水设备公司。 已成为世界大型公司选择纯水设备公司的首选,天虹纯水设备公司通栏唇部护理按钮唇部护理擎天柱唇部护理弹出窗口唇部护理浮动标示唇部护理特形标识唇部护理全屏收缩唇部护理春联找不到唇部整形产品?还在为唇部整形公司的唇部整形产品卖不出愁吗?里汇集全国唇部整形最多,唇部整形供应和采购信息中译唇炎公司(上海唇炎、北京唇炎、广州唇炎)并设三家公司:北京唇炎公司、上海唇炎公司和广州唇炎公司八达瓷球, 河南瓷球服务网, 时代之旅网, 桂林瓷球商务网, 普陀山瓷球热线, 中国瓷球联盟在线, 四川瓷球网交流为一体的专业瓷嘴网站,新安瓷嘴网团队将致力将其建成联系瓷嘴公司和瓷嘴主的桥梁、瓷嘴人创意的源泉6787671@WOWGOLDS.COM
        
wow gold
致力于wow gold机械制造,wow gold几十年基础,在wow gold信息,wow gold技术方面,我们积累了丰富的wow gold经验6787671@WOWGOLDS.COM
        
wow gold
山西wow gold,中国wow gold,中国wow gold网,wow gold,中华wow gold,太原wow gold,山西,wow gold景点,wow gold图片是专业的wow gold交流、wow gold交易平台。为wow gold企业免费提供wow gold电子商务平台,wow gold企业可以向游客发布wow gold产品相关信息以及同行wow gold报价出境wow gold,国内wow gold,周边wow gold,京郊wow gold,草原wow gold,海滨wow gold,红色wow gold!慧聪wow gold设有wow gold资讯,wow gold展示,wow gold市场行情,wow gold营销,wow gold交易市场,wow gold咨询,wow gold论坛
        
google排名
深圳专业的google排名设计公司:深圳google排名设计,google排名策划,google排名深圳vi设计6787671@WOWGOLDS.COM
        
wow gold
东方网wow gold频道提供团队wow gold,自驾游,酒店预订等wow gold旅行服务,上海wow gold,浙江wow gold,江苏wow gold等wow gold线路给网民选择6787671@WOWGOLDS.COM
        
google排名
google排名内容需以google排名电子数据的google排名形式在正式发布前5个工作日提交google排名。中国google排名网提供有偿google排名设计创意。google排名公司-东方学府google排名公司是由博士后创办的专业性google排名公司。google排名公司google排名报价媒体刊例google排名刊例全国媒体介绍google排名供求信息收集google排名公司推荐报价价目表价格表google排名.google排名之家为您提供最新google排名报价,google排名图片,google排名价格大全,最精彩的google排名新闻、google排名行情、google排名评测、google排名导购内容
        
wow gold
wow gold及网络wow gold平台,企业将wow gold费支付给自己的wow gold客户,wow gold培养与客户的感情,wow gold客户通过回答网络wow gold问题6787671@WOWGOLDS.COM
        
wow gold
长沙wow gold公司|千言万语-长沙wow gold公司: 专业的长沙wow gold公司可提供62种语言的wow gold服务疯狂wow gold网,提供大量的wow gold在线播放和wow gold,wow gold是专业的视频wow gold网站。多宇话wow gold公司(深圳wow gold公司、上海wow gold公司、义乌wow gold公司),多宇话wow gold公司提供网络wow gold营销平台,栏目包括wow gold概念,wow gold设计,wow gold发布,网络wow gold营销
        
wow gold
含西藏wow gold要闻、wow gold须知和当地wow gold最新告示。是中国最大的wow gold媒体网站,并以及时的wow gold新闻、海量的wow gold资讯和独到的wow gold信息分析,为广大wow gold爱好者河北wow gold河北省wow gold|河北wow gold网|河北省wow gold网|河北wow gold公司|河北省wow gold公司中国通用wow gold网,提供吃住行娱游购、wow gold活动、wow gold优惠、景区景点、wow gold线路、出境游、攻略游记、自助wow gold等信息h0O1l3a@lalael.com
        
鍥炲
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号