`
wind_bell
  • 浏览: 292022 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

多线程编程 秘籍篇(二)注:转

阅读更多

volatile 变量

volatile 是用来保证[内存同步]的关键字,内存同步是说在某个线程中修改某实例字段能够及时地
更新到主存储区,而某线程如果需要引用该字段也能及时地从主存储区中得到最新的数据.

简单说它是当前线程的工作存储区和主存储区对某字段的及时同步,所以我们说它是[内存同步],但它
不是线程同步.

也就是说,一个线程对 volatile字段进行更新时,它只会把更新后的值及时地同步到主存储区,而并不
保证其它线程中该字段的值得到及时更新.(不过其它线程如果要对该字段访问的话还会及时从主存储
区COPY的).

因为只保证当前线程中对volatile字段的更新会及时与主存储区同步,所以volatile并不能达到同步的
功能.比如线程A和B最初的 volatile int x = 10;当线程A奖x +1后,线程A的工作存储区的x和主工作存
储区的x都为11,但这时线程B中的x仍然为10,只有当线程B需要访问x时才会从主存储区中COPY x的值使
x为11.但是如果线程B没有对x进行操作,而在某种条件下如离开同步块,进行工作存储区与主存储区同步
时,就会把当前值10覆盖到主存储区中.

所以 volatile 关键字并不能保证多个线程同时对主存储区字段的"同步".只有在某种条件下,最合适的
情况就是只有某一线程修改某一变量后,其它线程只是对其进行引用而不再更新.比如我们设置的线程
退出标记.
volatile boolean exit = false;

这样的变量用于在所有线程中判断是否退出,其中任何一个线程修改为true后,会及时更新主存储区中
该变量的值,而其它线程也能及时获取到该值的变化而及时地结束自己的工作.

volatile 可以保证 double和long操作是原子操作.

原子操作(atomic)是指对变量从主存储COPY到线程工作存储区时,经及从线程的工作存储区写回到主存储
区时,不会因为其它线程的同时操作而改变变量的值.

对于普通变量,double和long在设计的时候并不是原子型操作,也就是对地这两种变量的上述操作在一定情
况下可能会因为其它线程而覆盖我们的操作.那么volatile可以保证double和long象int一样的atomic操作.
 

另外,从JSR133以后,由于对JAVA内存模型进行的修复,volatile 变量有了更大的作用.

对于前面讨论的比检锁问题,如果(这里只是假设,事实上我们不会这样做,后面说原因)我们对instance(obj)变量声明为

volatile 的,那么在第一个线程初始化后,如果线程a中的Date d是可访问的,那么对于线程B中也是可见的.也就是说它修补了双验锁的缺陷,使JAVA的双检锁不再存在陷井.

那么真的这么简单地就修补了这个陷井吗?从理论上说,是的.但实际上.它没有真正达到目的.因为这样的保证消耗了大量的性能.因为一量声明obj为volatile ,你不能在第一次被始化成功后再将instance恢复成非volatile 的,那么每次对install的引用都会引用大量的同步工作.这实际上比贪婪式声明static MyObject  obj  = new MyObect (); 消耗更多的性能,基本与public static MyObect  getInstance()的同步方法相当,如此我们为什么要修改这样的双检锁呢?

分享到:
评论

相关推荐

    基于C#的大型自动化设备二次注液机上位软件源码.zip

    本篇文章将深入探讨基于C#语言开发的大型自动化设备二次注液机的上位软件源码,结合其数据库功能以及与欧姆龙PLC的通信机制,为读者揭示其中的关键技术点。 首先,C#作为一种面向对象的编程语言,以其强大的类库...

    C++线程池实现原理

     多线程编程是C++开发者的一个基本功, 但是很多开发者都是直接使用公司给包装好的线程池库, 没有去了解具体实现,有些实现也都因为高度优化而写得讳莫如深,让初学者看得吃力。  所以写这篇文章主要是想以非常...

    C#范例开发大全.(清华出版.刘丽霞,李俊民)

     本书共21章,分3篇,内容涉及窗体设置、控件的应用、组件的应用、文件操作、图形图像、多媒体技术、系统操作、注册表编辑、数据库基础、报表与打印技术、正则表达式、多线程编程技术、局域网开发技术、c# 3.0新增...

    系统架构之高性能数据传输系统的框架设计

    [注:此篇用select来讲解,虽在大并发的情况下,epoll拥有更高的效率,但整体设计思路是一致的]首先来看看课本和学习资料上关于处理并发网络编程的三种常用方案,以及对应的大体思路和优缺点:1)IO多路复用模型->...

    JavaJava+EE软件工程师就业求职手册.doc

    - **9.1 Java的多线程机制** - **9.1.1 区别进程和线程**:比较进程与线程的概念。 - **9.1.2 了解线程的状态**:介绍线程生命周期中的各种状态。 - **9.1.3 创建线程的两种方式**:比较通过继承Thread类和实现...

    计算机操作系统课后答案

    ### 第二章 进程与线程思考与练习题解析 **1. 操作系统中为什么要引入进程的概念?为了实现并发进程之间的合作和协调,以及保证系统的安全,操作系统在进程管理方面要做哪些工作?** 进程是操作系统中资源分配的...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例143 使用线程池优化多线程编程 186 实例144 Object类中线程相关的方法 187 实例145 哲学家就餐问题 189 实例146 使用信号量实现线程同步 190 实例147 使用原子变量实现线程同步 191 实例148 使用事件分配线程...

    IIS6.0 IIS,互联网信息服务

     第二篇 IIS之FTP服务器 一、建立你的FTP站点 第一个FTP站点(即“默认FTP站点”)的设置方法和更多FTP站点的建立方法请参照前文Web服务器中相关操作执行。需要注意的是,如果你要用一个IP地址对应多个不同的FTP...

Global site tag (gtag.js) - Google Analytics