`

并发--Effective Java的一小段代码

 
阅读更多
import java.util.concurrent.TimeUnit;

/**
 * @author gl65293
 *
 */
public class StopThread {

    /**
     * @param args
     */
    
    private static boolean stopRequested;
    
    public static void main(String[] args) throws InterruptedException {
    
        Thread backgroundThread = new Thread(new Runnable(){
            public void run(){
                int i = 0;
                while(!stopRequested){
                    i++;
                }
            }
        });
        
        backgroundThread.start();
        
        TimeUnit.SECONDS.sleep(1);
        stopRequested = true;
    }

}

在Effective Java 中文版 第二版的230页,说的是这个程序不会停下来. 可你把这个程序放入到eclipse这种ide里去执行的时候,你却发现在很多时候,这个程序都会在执行1秒后停下来. 为什么呢? 这个怎么跟书上说的不一样?

其实, 书上跟自己的实践都是对的, 在eclipse ide里执行这个程序里, 你要加上 -server参数, 这个程序运行就不会停下来了.

这是为什么呢?
因为在加上 -server参数后, jvm会对执行顺序进行优化.

解释如下:
backgroundThread什么时候退出循环是不能确定的,有可能1秒后就退出了,也有可能永远不会退出。程序执行时有如下2中可能情况:
第一种可能,由于stopRequested没有同步或者volatile修饰,jvm为了加快线程的执行速度,每个线程都会对stopRequested做变量拷贝,这时候对变量的修改可能就不会或者不能够及时同步到每个线程中,这种情况backgroundThread 线程什么时候执行结束是不能确定的,>=1秒后结束,或者永远不会结束都有可能。

第二种可能,jvm会对
                while(!stopRequested){
                    i++;
                }



做优化,优化后程序执行流程变为
          if(!stopRequested) {
                while(true){
                    i++;
                }
           }


,这种情况,backgroundThread线程永远不会结束。

为了避免以上两种情况,可以用volatile修饰stopRequested,这样每个线程在修改stopRequested后都会把修改结果同步到主内存,每个线程在读取stopRequested时都会从主内存中获取;volatile同时也阻止了jvm对第二种情况的优化

建议细看: 《java并发编程实践》

注:
在不加 volatile修饰, 把i++改成System.out.println("t"); 的情况下, 使用-server, -client参数都会在1秒后退出.

在windows下,jvm默认是client模式, 在linux下默认是 server模式.

参考:
Java线程安全兼谈DCL
用happen-before规则重新审视DCL
分享到:
评论

相关推荐

    Effective Java第三版1

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,它提供了许多最佳实践和设计原则,帮助开发者写出更高效、更可维护的代码。第三版延续了这一传统,对Java语言的新特性进行了更新,并给出了...

    Effective-Java:Effective Java中文版第二版示例代码

    这本书提供了许多实用的编程实践和经验教训,帮助开发者编写出更高效、可维护的Java代码。这里我们将围绕"Effective-Java:Effective Java中文版第二版示例代码"这一主题,深入探讨书中的核心知识点。 1. **单例模式...

    effectiveJava课件分享

    总之,"Effective Java"中的这些指导原则旨在帮助开发者编写出高质量的Java代码。遵循这些原则,我们可以提升代码的可维护性、可读性和性能,同时降低出错的可能性。通过最小化类和成员的可访问性,使用访问方法,...

    Effective.Enterprise.Java.中文版 高清pdf 下载

    总的来说,《Effective Enterprise Java》中文版是一本值得每一个Java开发者阅读的书籍,它不仅提供了丰富的编程技巧,还强调了代码的可读性和可维护性,对于提升个人技能和团队开发效率都有极大的帮助。通过深入...

    Effective-Java-2nd-Edition-(May-2008).zip_effective java

    这本书旨在提供实用的编程指导,帮助开发者写出更高效、更可维护的Java代码。以下是对书中核心知识点的详细解读: 1. **类和对象的设计原则**:书中强调了设计良好的API的重要性,包括接口的使用、类的封装、以及...

    《Effective Java》读书分享.pptx

    《Effective Java》读书分享.pptx 是一本 Java 编程语言指南,旨在帮助开发者编写高质量、可维护的 Java 代码。该书包含 90 个条目,每个条目讨论一条规则,涵盖了 Java 编程语言的方方面面。 创建和销毁对象 在 ...

    Effective Java.zip

    《Effective Java》是一本经典Java编程指南,作者是Joshua Bloch,这本书深入探讨了如何编写高质量、高效、可维护的Java代码。以下是对压缩包中各章节主要知识点的详细阐述: 1. **第2章 创建和销毁对象** - 单例...

    Java并发实践英文版(Java Concurrency in Practice)

    ### Java并发实践知识点详解 #### 一、书籍基本信息与作者...综上所述,《Java并发实践》是一本非常有价值的参考书籍,不仅适用于初学者了解并发编程的基础知识,也适合经验丰富的开发者深入了解高级主题和技术细节。

    java并发编程实战(英文版)

    综上所述,《Java并发编程实战》不仅涵盖了Java并发编程的基础知识和技术细节,还包含了丰富的实践经验和前瞻性的思考,是任何一位从事Java开发工作的程序员不可或缺的学习资源。无论是初学者还是有经验的开发者都能...

    java优秀源码-Effective-Java-Concepts:Java源代码可以强化概念,我正在从JoshuaBloch的出色著作“Eff

    这本书深入探讨了如何编写高效、可维护的Java代码,并提出了许多实用的编程实践和设计原则。通过对书中源代码的分析,我们可以更深入地理解Java语言的特性和最佳实践。 在阅读和研究《Effective Java》中的源码时,...

    Effective Enterprise Java

    《Effective Enterprise Java》是一本深度探讨企业级Java应用开发的经典著作。这本书主要针对J2EE(Java 2 Platform, Enterprise Edition)平台,旨在提供一系列实用的编程指导和最佳实践,帮助开发者编写出高效、...

    effective enterprise java 中文版

    同时,提供了调试Java代码的技巧,包括使用IDE的调试工具和远程调试。 8. **性能调优**:分析了性能瓶颈的常见来源,并提供了一系列的调优策略,包括代码优化、数据库查询优化以及使用JProfiler等性能分析工具。 9...

    Effective-Java读书笔记

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,它提供了许多实用的编程指导原则,帮助开发者写出更高效、更可维护的代码。这本书分为多个条目,每个条目都深入探讨了一个特定的Java编程实践...

    java源码测试-effective-java:读EffectiveJava(中文版第3版)阅读源码测试案列

    这本书包含了一系列编程实践和设计模式,旨在帮助程序员写出更高效、更可靠、更易于维护的Java代码。在阅读这本书的过程中,结合源码进行测试是理解其思想和应用的关键步骤。 源码测试是一种验证代码功能、性能和...

    Java-Effective:Java Effective 2nd Edition书中的源代码

    这本书深入探讨了如何编写出高质量、高效、可维护的Java代码,涵盖了众多最佳实践和设计模式。这里我们将围绕书中的源代码,解析其中蕴含的重要知识点。 1. **类和对象的设计原则**: - **最小化访问权限**:书中...

    effecctivejava 第三版中文

    这些只是《Effective Java》第三版中的一部分主题,全书涵盖了大量关于如何编写高质量Java代码的实用建议。通过阅读和实践书中的内容,开发者能够更好地掌握Java编程的最佳实践,从而提升自己的编程技艺。

    Effective Java 第三版

    《Effective Java 第三版》是由Joshua Bloch所著的一本关于Java编程的书籍,旨在向Java开发者传授编写高效、健壮、可靠的Java代码的最佳实践。书中分为多个章节,每一章节都详细介绍了Java语言中的一个特定主题,并...

    TCP-IP Sockets in Java, Second Edition- Practical Guide for Prog

    - **《Effective Java Networking》**:提供实用建议和技术细节,帮助优化网络应用程序的性能。 通过《TCP/IP Sockets in Java, Second Edition - 实用编程指南》,读者不仅可以学到理论知识,还能通过实践加深理解...

    java源码总结-Effective-Java-3E:有效Java第三版的源代码示例和摘要的回购

    这本书汇集了众多编程最佳实践,旨在帮助开发者写出更高效、更可维护的Java代码。以下是对《Effective Java》第三版源代码示例和摘要的一些关键知识点的详细解释: 1. **枚举(Enums)**:书中强调了使用枚举类型而...

Global site tag (gtag.js) - Google Analytics