Java多线程初学者指南(6):慎重使用volatile关键字

Java多线程初学者指南(6):慎重使用volatile关键字

ID:39549661

大小:16.48 KB

页数:3页

时间:2019-07-06

Java多线程初学者指南(6):慎重使用volatile关键字_第1页
Java多线程初学者指南(6):慎重使用volatile关键字_第2页
Java多线程初学者指南(6):慎重使用volatile关键字_第3页
资源描述:

《Java多线程初学者指南(6):慎重使用volatile关键字》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、volatile关键字相信了解Java多线程的读者都很清楚它的作用。volatile关键字用于声明简单类型变量,如int、float、boolean等数据类型。如果这些简单数据类型声明为volatile,对它们的操作就会变成原子级别的。但这有一定的限制。例如,下面的例子中的n就不是原子级别的:package mythread;public class JoinThread extends Thread{    public staticvolatileint n = 0;   public void run()    {        for (int i = 0; i <

2、 10; i++)            try        {                n = n + 1;                sleep(3); // 为了使运行结果更随机,延迟3毫秒            }            catch (Exception e)            {            }    }    public static void main(String[] args) throws Exception    {        Thread threads[] = new Thread[100];    

3、    for (int i = 0; i < threads.length; i++)            // 建立100个线程            threads[i] = new JoinThread();        for (int i = 0; i < threads.length; i++)            // 运行刚才建立的100个线程            threads[i].start();        for (int i = 0; i < threads.length; i++)            // 100个线程都执行完后

4、继续            threads[i].join();        System.out.println("n=" + JoinThread.n);    }}   如果对n的操作是原子级别的,最后输出的结果应该为n=1000,而在执行上面积代码时,很多时侯输出的n都小于1000,这说明n=n+1不是原子级别的操作。原因是声明为volatile的简单变量如果当前值由该变量以前的值相关,那么volatile关键字不起作用,也就是说如下的表达式都不是原子操作:n = n + 1;n++;   如果要想使这种情况变成原子操作,需要使用synchronized关键字,如

5、上的代码可以改成如下的形式:package mythread;public class JoinThread extends Thread{    public staticint n = 0;    publicstatic synchronized void inc()    {        n++;    }    public void run()    {        for (int i = 0; i < 10; i++)            try            {                inc(); // n = n + 1 改成了 i

6、nc();                sleep(3); // 为了使运行结果更随机,延迟3毫秒            }            catch (Exception e)            {            }    }    public static void main(String[] args) throws Exception    {        Thread threads[] = new Thread[100];        for (int i = 0; i < threads.length; i++)          

7、  // 建立100个线程            threads[i] = new JoinThread();        for (int i = 0; i < threads.length; i++)            // 运行刚才建立的100个线程            threads[i].start();        for (int i = 0; i < threads.length; i++)            // 100个线程都执行完后继续            threads[i]

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。