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》是Java编程领域的一本经典著作,由Joshua Bloch撰写,它提供了许多最佳实践和设计原则,帮助开发者写出更高效、更可维护的代码。第三版延续了这一传统,对Java语言的新特性进行了更新,并给出了...
这本书提供了许多实用的编程实践和经验教训,帮助开发者编写出更高效、可维护的Java代码。这里我们将围绕"Effective-Java:Effective Java中文版第二版示例代码"这一主题,深入探讨书中的核心知识点。 1. **单例模式...
总之,"Effective Java"中的这些指导原则旨在帮助开发者编写出高质量的Java代码。遵循这些原则,我们可以提升代码的可维护性、可读性和性能,同时降低出错的可能性。通过最小化类和成员的可访问性,使用访问方法,...
总的来说,《Effective Enterprise Java》中文版是一本值得每一个Java开发者阅读的书籍,它不仅提供了丰富的编程技巧,还强调了代码的可读性和可维护性,对于提升个人技能和团队开发效率都有极大的帮助。通过深入...
这本书旨在提供实用的编程指导,帮助开发者写出更高效、更可维护的Java代码。以下是对书中核心知识点的详细解读: 1. **类和对象的设计原则**:书中强调了设计良好的API的重要性,包括接口的使用、类的封装、以及...
《Effective Java》读书分享.pptx 是一本 Java 编程语言指南,旨在帮助开发者编写高质量、可维护的 Java 代码。该书包含 90 个条目,每个条目讨论一条规则,涵盖了 Java 编程语言的方方面面。 创建和销毁对象 在 ...
《Effective Java》是一本经典Java编程指南,作者是Joshua Bloch,这本书深入探讨了如何编写高质量、高效、可维护的Java代码。以下是对压缩包中各章节主要知识点的详细阐述: 1. **第2章 创建和销毁对象** - 单例...
### Java并发实践知识点详解 #### 一、书籍基本信息与作者...综上所述,《Java并发实践》是一本非常有价值的参考书籍,不仅适用于初学者了解并发编程的基础知识,也适合经验丰富的开发者深入了解高级主题和技术细节。
综上所述,《Java并发编程实战》不仅涵盖了Java并发编程的基础知识和技术细节,还包含了丰富的实践经验和前瞻性的思考,是任何一位从事Java开发工作的程序员不可或缺的学习资源。无论是初学者还是有经验的开发者都能...
这本书深入探讨了如何编写高效、可维护的Java代码,并提出了许多实用的编程实践和设计原则。通过对书中源代码的分析,我们可以更深入地理解Java语言的特性和最佳实践。 在阅读和研究《Effective Java》中的源码时,...
《Effective Enterprise Java》是一本深度探讨企业级Java应用开发的经典著作。这本书主要针对J2EE(Java 2 Platform, Enterprise Edition)平台,旨在提供一系列实用的编程指导和最佳实践,帮助开发者编写出高效、...
同时,提供了调试Java代码的技巧,包括使用IDE的调试工具和远程调试。 8. **性能调优**:分析了性能瓶颈的常见来源,并提供了一系列的调优策略,包括代码优化、数据库查询优化以及使用JProfiler等性能分析工具。 9...
《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,它提供了许多实用的编程指导原则,帮助开发者写出更高效、更可维护的代码。这本书分为多个条目,每个条目都深入探讨了一个特定的Java编程实践...
这本书包含了一系列编程实践和设计模式,旨在帮助程序员写出更高效、更可靠、更易于维护的Java代码。在阅读这本书的过程中,结合源码进行测试是理解其思想和应用的关键步骤。 源码测试是一种验证代码功能、性能和...
这本书深入探讨了如何编写出高质量、高效、可维护的Java代码,涵盖了众多最佳实践和设计模式。这里我们将围绕书中的源代码,解析其中蕴含的重要知识点。 1. **类和对象的设计原则**: - **最小化访问权限**:书中...
这些只是《Effective Java》第三版中的一部分主题,全书涵盖了大量关于如何编写高质量Java代码的实用建议。通过阅读和实践书中的内容,开发者能够更好地掌握Java编程的最佳实践,从而提升自己的编程技艺。
《Effective Java 第三版》是由Joshua Bloch所著的一本关于Java编程的书籍,旨在向Java开发者传授编写高效、健壮、可靠的Java代码的最佳实践。书中分为多个章节,每一章节都详细介绍了Java语言中的一个特定主题,并...
- **《Effective Java Networking》**:提供实用建议和技术细节,帮助优化网络应用程序的性能。 通过《TCP/IP Sockets in Java, Second Edition - 实用编程指南》,读者不仅可以学到理论知识,还能通过实践加深理解...
这本书汇集了众多编程最佳实践,旨在帮助开发者写出更高效、更可维护的Java代码。以下是对《Effective Java》第三版源代码示例和摘要的一些关键知识点的详细解释: 1. **枚举(Enums)**:书中强调了使用枚举类型而...