栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java中volatile关键字的作用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java中volatile关键字的作用

Java中volatile关键字的作用

在Java的多线程工作模式下,每一个线程都有自己的一个内存空间,在对实际的变量进行修改时,每一个线程需要先把主内存内的变量拷贝到自己的内存空间中,在拷贝完成后,再进行修改,最后再把修改后的变量放回到主内存中。

但是如果同时有多个线程对同一个变量进行修改操作,如上图所示,假如A线程和B线程同时把变量i拷贝到自己的内存空间中,进行修改,假如同时减1,则再将修改后的i放回到主内存时,实际i只变化了一次,达不到多线程的效果。

测试一

看一下如下的代码,是没有使用volatile关键字做同步的

class Resource implements Runnable {
    public int i;
    public  Resource(int _i){
        i = _i;
    }
    public void run(){
        while(true){
            if (i>0){
                i--;
                System.out.println(Thread.
                        currentThread().getName()+"  "+i);
            }
            else{
                System.out.println(Thread.
                        currentThread().getName());
                break;
            }
        }
    }
}
public class TestPriority{
    public static void main(String[] args){
        Resource m = new Resource(100);
        Thread t1 = new Thread(m);
        Thread t2 = new Thread(m);
        t1.setPriority(Thread.MIN_PRIORITY);
        t2.setPriority(Thread.MAX_PRIORITY);
        t1.start();
        t2.start();
    }
}

这个程序的目的是使用两个线程,来对同一个变量i进行操作,使其从100不断减少到0,并打印中间值,在本程序中,i并没有使用volatile关键字进行修饰,其部分运行结果如下:

可以看到,其中有些中间值被输出了两次,原因就是同时对变量i做了修改。

测试二

测试二相比较测试一的代码改动为:i变量用volatile关键字进行了修饰
运行结果如下

可以看到是没有冲突的

总结

volatile关键字可以保证内存中变量的可见性,可以让每一个线程知道变量最新的值,当一个共享变量被volatile修饰时,它会保证修改的值立即被更新到主存中。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/489531.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号