文档章节

java中Volatile关键字的作用

klaus丶
 klaus丶
发布于 2014/06/22 16:10
字数 505
阅读 876
收藏 22
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。

这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。

而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。

使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。

由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。

一般的,如果多个线程协作存、取某个变量时,一般需要用到synchronized关键字进行同步操作,如:
public class MyTestThread extends MyTest implements Runnable {
    private boolean _done = false;
    public synchronized boolean getDone()
    {
        return _done;
    }
    public synchronized void setDone(boolean b)
    {
        _done = b;
    }
    
    public void run( ) {
        boolean done;
        done = getDone();
        while (!done) {
            repaint( );
            try {
                Thread.sleep(100);
            } catch (InterruptedException ie) {
                return;
            }
        }
    }
}
或者:
public class MyTestThread extends MyTest implements Runnable {
    private boolean _done = false;
    public void setDone(boolean b)
    {
        synchronized(this)
        {
            _done = b;
        }
    }
    
    public void run( ) {
        boolean done;
        synchronized(this)
        {
            done = _done;
        }
        
        while (!done) {
            repaint( );
            try {
                Thread.sleep(100);
            } catch (InterruptedException ie) {
                return;
            }
        }
    }
}
但是,通过volatile关键字,我们可以大大简化:
public class MyTestThread extends MyTest implements Runnable {
    private volatile boolean done = false;
    public void run( ) {
        while (!done) {
            repaint( );
            try {
                Thread.sleep(100);
            } catch (InterruptedException ie) {
                return;
            }
        }
    }
    public void setDone(boolean b) {
        done = b;
    }
}


© 著作权归作者所有

共有 人打赏支持
klaus丶
粉丝 0
博文 46
码字总数 10229
作品 0
海淀
程序员
Java中volatile关键字的作用

volatile是Java中用来做同步的一个关键字,之前对它的作用一直理解得不是很透彻。 于是在网上查阅了一些资料,发现也讲得含混不清。 后来在wikipedia(http://en.wikipedia.org/wiki/Volatile...

GreenDay
2014/03/08
0
0
Java并发学习之Volatile及内存模型探究

volatile工作原理 java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。 Java语言提供了volatile,在某些情况下比锁更加方便...

小灰灰Blog
2017/11/02
0
0
java关键字 volatile的作用及使用说明

先来看看这个关键字是什么意思: volatile [ˈvɒlətaɪl] adj. 易变的,不稳定的; 从翻译上来看,volatile表示这个关键字是极易发生改变的。 volatile是java语言中,最轻量级的并发同步机制...

王若伊_恩赐解脱
08/09
0
0
Java中的transient,volatile和strictfp关键字

Java中的transient,volatile和strictfp关键字 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。例如: class T { transient int a; //不需要维持 int b; //需要维持 } ...

xiahuawuyu
2012/05/17
0
0
Java中的transient,volatile和strictfp关键字

class T { transient int a; //不需要维持 int b; //需要维持 } class T {transient int a; //不需要维持int b; //需要维持} 这里,如果T类的一个对象写入一个持久的存储区域,a的内容不被保...

哈全文
2012/09/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

49.Nginx防盗链 访问控制 解析php相关 代理服务器

12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配置(502的问题) 12.16 Nginx代理 扩展 502问题汇总 http://ask.apelearn.com/question/9109 location优先级 http://blog....

王鑫linux
49分钟前
0
0
Nginx防盗链、访问控制、解析php相关配置、Nginx代理

一、Nginx防盗链 1. 编辑虚拟主机配置文件 vim /usr/local/nginx/conf/vhost/test.com.conf 2. 在配置文件中添加如下的内容 { expires 7d; valid_referers none blocked server_names *.tes......

芬野de博客
今天
0
0
spring EL 和资源调用

资源调用 import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.PropertySource;import org.springframework.core.io.Resource;......

Canaan_
今天
1
0
memcached命令行、memcached数据导出和导入

一、memcached命令行 yum装telnet yum install telent 进入memcached telnet 127.0.0.1 11211 命令最后的2表示,两位字节,30表示过期时间(秒) 查看key1 get key1 删除:ctrl+删除键 二、m...

Zhouliang6
今天
0
0
Linux定时备份MySQL数据库

做项目有时候要备份数据库,手动备份太麻烦,所以找了一下定时备份数据库的方法 Linux里有一个 crontab 命令被用来提交和管理用户的需要周期性执行的任务,就像Windows里的定时任务一样,用这...

月夜中徘徊
今天
1
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部