知识大全 慎重使用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

相关参考