知识大全 慎重使用volatile关键字

Posted 原子

篇首语:犀渠玉剑良家子,白马金羁侠少年。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 慎重使用volatile关键字相关的知识,希望对你有一定的参考价值。

Java多线程初学者指南(6):慎重使用volatile关键字  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  volatile关键字相信了解Java多线程的读者都很清楚它的作用 volatile关键字用于声明简单类型变量 如int float boolean等数据类型 如果这些简单数据类型声明为volatile 对它们的操作就会变成原子级别的 但这有一定的限制 例如 下面的例子中的n就不是原子级别的

   package mythread;public class JoinThread extends Thread    public static volatile int n =  ;    public void run()            for (int i =  ; i <  ; i++)            try                        n = n +  ;                sleep( ); // 为了使运行结果更随机 延迟 毫秒                        catch (Exception e)                                public static void main(String[] args) throws Exception            Thread threads[] = new Thread[ ];        for (int i =  ; i < threads length; i++)            // 建立 个线程            threads[i] = new JoinThread();        for (int i =  ; i < threads length; i++)            // 运行刚才建立的 个线程            threads[i] start();        for (int i =  ; i < threads length; i++)            //  个线程都执行完后继续            threads[i] join();        System out println( n=  + JoinThread n);    

  如果对n的操作是原子级别的 最后输出的结果应该为n= 而在执行上面积代码时 很多时侯输出的n都小于 这说明n=n+ 不是原子级别的操作 原因是声明为volatile的简单变量如果当前值由该变量以前的值相关 那么volatile关键字不起作用 也就是说如下的表达式都不是原子操作

   n = n +  ;n++;

  如果要想使这种情况变成原子操作 需要使用synchronized关键字 如上的代码可以改成如下的形式

   package mythread;public class JoinThread extends Thread    public static int n =  ;    public static synchronized void inc()            n++;        public void run()            for (int i =  ; i <  ; i++)            try                            inc(); // n = n +   改成了 inc();                sleep( ); // 为了使运行结果更随机 延迟 毫秒                        catch (Exception e)                                public static void main(String[] args) throws Exception            Thread threads[] = new Thread[ ];        for (int i =  ; i < threads length; i++)            // 建立 个线程            threads[i] = new JoinThread();        for (int i =  ; i < threads length; i++)            // 运行刚才建立的 个线程            threads[i] start();        for (int i =  ; i < threads length; i++)            //  个线程都执行完后继续            threads[i] join();        System out println( n=  + JoinThread n);    

cha138/Article/program/Java/gj/201311/27293

相关参考

知识大全 多核线程-volatile原理与技巧

  为什么使用volatile比同步代价更低?  同步的代价主要由其覆蓋范围决定如果可以降低同步的覆蓋范围则可以大幅提升程序性能  而volatile的覆蓋范围仅仅变量级别的因此它的同步代价很低  v

知识大全 java的volatile与多线程

  Java语言规范中指出为了获得最佳速度允许线程保存共享成员变量的私有拷贝而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比  Volatile修饰的成员变量在每次被线程访问时都强迫从

知识大全 Java多线程之volatile深入分析

Java多线程之volatile深入分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  vola

知识大全 Java理论与实践: 正确使用Volatile变量

Java理论与实践:正确使用Volatile变量  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 JAVA高级:多核线程-volatile原理与技巧[1]

JAVA高级:多核线程-volatile原理与技巧[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 JAVA高级:多核线程-volatile原理与技巧[2]

JAVA高级:多核线程-volatile原理与技巧[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 JAVA高级:多核线程-volatile原理与技巧[4]

JAVA高级:多核线程-volatile原理与技巧[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 JAVA高级:多核线程-volatile原理与技巧[3]

JAVA高级:多核线程-volatile原理与技巧[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 Java 理论与实践: 正确使用 volatile 变量 线程同步

Java理论与实践:正确使用volatile变量线程同步  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

玉米高产关键技术要点

一、品种选择  具备良好性状的种子是高产丰产的关键,所以对于玉米的品种选择一定要认真慎重。在种植前要对土壤情况、气候类型、管理程度及当地的种植习惯等做充分的了解,然后根据这些因素进行综合考虑,再决定选