`

java关键字:Volatile

    博客分类:
  • java
阅读更多

原文链接:http://blog.csdn.net/kaiwii/article/details/6753373

 

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;
    }
}
分享到:
评论

相关推荐

    java volatile 关键字实战

    java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java ...

    Java并发编程:volatile关键字解析

    ### Java并发编程:volatile关键字解析 #### 一、内存模型的相关概念 在深入了解`volatile`关键字之前,我们首先需要理解计算机内存模型的一些基本概念。在现代计算机系统中,CPU为了提高执行效率,会将频繁访问的...

    Java线程:volatile关键字

    Java 线程 volatile 关键字详解 Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。volatile 变量的同步性较差,但它有时更简单并且开销更低。volatile 变量可以被看作是一种 “程度较轻的 ...

    深入解析Java中的volatile关键字:原理、应用与实践

    在Java并发编程中,volatile关键字是一种轻量级的同步机制,它用于确保变量的可见性和有序性。本文将详细探讨volatile关键字的工作原理、使用场景以及如何在实际开发中正确使用volatile。 volatile关键字是Java并发...

    Java基础:volatile详解.pdf

    Java基础:volatile详解 Java基础:volatile详解问:谈谈你对volatile的理解? volatile是Java虚拟机提供的轻量级的同步机制,它有三个特性:保证可见性、不保证原子性、禁止指令重排。 1、volatile保证可见性 ...

    【IT十八掌徐培成】Java基础第02天-01.java关键字.zip

    本教程"【IT十八掌徐培成】Java基础第02天-01.java关键字"深入讲解了Java的关键字及其用途。 Java的关键字主要分为以下几类: 1. 数据类型关键字:`byte`, `short`, `int`, `long`, `float`, `double`, `char`, `...

    Java中的`volatile`关键字:原理、应用与实践

    volatile关键字是Java中处理共享变量可见性的有效工具,但适用场景有限。在使用volatile时,需确保其满足线程安全的要求,特别是在需要原子操作的情况下,可能还需要结合其他同步机制。掌握volatile的使用方法,有助...

    深入解析volatile关键字:保障多线程下的数据一致性与可见性.pdf

    同时,我们也应该注意到`volatile`并不能保证操作的原子性,因此在需要原子性操作时还需要考虑其他同步机制,如`synchronized`关键字或`java.util.concurrent`包中的高级同步工具类。在实际开发中灵活运用这些工具和...

    JAVA标识符关键字和数据类型.ppt

    goto和const虽然从未使用,但也作被为Java关键字保留。Java关键字包括: * 原始数据类型:byte、short、int、long、float、double、char、boolean * 循环关键字:do、while、for、break、continue * 分支关键字:if...

    search_keyword12.rar_Java关键字

    Java关键字是编程的基础,它们是Java语言预定义的标识符,具有特定的含义和功能,不能用作变量名、方法名或类名。在Java中,关键字是保留给编译器使用的,它们对于理解程序的结构和控制流程至关重要。本文将深入探讨...

    java关键字总结文档

    ### Java关键字总结 Java是一种广泛使用的面向对象编程语言,它具备简单性、可移植性、高性能等特点。在Java中,关键字具有特殊的语法含义,不能用作标识符(例如变量名或方法名)。以下是对给定文件中提到的Java...

    Java关键字总结珍藏版

    `throws`, `instanceof`, `transient`, `volatile`, `interface`, `package`, `import`, `enum`, `default`, `assert` 等,它们都在构建 Java 程序时起着不可或缺的作用。理解和熟练掌握这些关键字是成为一个优秀的...

    java里的volatile关键字详解

    "Java中的Volatile关键字详解" Java中的Volatile关键字详解是Java中的一种关键字,用于保证线程之间的可见性、原子性和有序性。下面是对Java中的Volatile关键字详解的知识点总结: 一、基本概念 1. 可见性:可见...

    JAVA关键字列表

    JAVA关键字列表 Java是一种面向对象的编程语言,具有多种关键字,用于控制程序的执行、定义变量、类和方法等。本文档系统列举了Java的关键字及其用法分类,总共分为以下几个类别:访问控制、类、变量修饰符、流程...

    Java多线程编程总结

    Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java线程:新特征-信号量 Java线程:新特征-阻塞队列 Java线程:新特征-...

    java 关键字查询文档

    Java 关键字是编程语言中具有特殊含义的保留词汇,它们不能用作变量名、类名或方法名。这些关键字在 Java 中扮演着至关重要的角色,用于定义程序结构、控制流程、内存管理等方面。这份“java 关键字查询文档”显然是...

    Java关键字详细解

    这篇文档《Java关键字详细解》将深入探讨Java中的关键字及其用途。 首先,我们来看看Java中的主要关键字。`public`、`private`、`protected`是访问修饰符,用于控制类、方法和变量的访问权限。`public`可以被任何...

    Java关键字volatile和synchronized作用和区别

    Java关键字volatile和synchronized作用和区别 Java关键字volatile和synchronized是Java语言中两个常用的关键字,它们都是用来解决多线程编程中的同步问题的,但它们的作用和用法却有所不同。 volatile关键字是变量...

    java关键字、保留字

    ### Java关键字详解 #### 概述 Java是一种广泛使用的面向对象编程语言,它拥有丰富的关键字集,用于控制程序的行为和结构。Java关键字是由Java语言预定义的标识符,具有特殊的含义,不能用作变量名、方法名或类名等...

    Java标识符、关键字和保留字

    Java关键字是小写形式,这是因为它对大小写敏感,即关键字的每个字母都需要严格地小写。Java语言中的关键字数量有限,共有50个,包括用于定义类的关键字`class`、控制流程的关键字如`if`、`else`、`for`、`while`等...

Global site tag (gtag.js) - Google Analytics