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