effective java 书中66条中的这段代码:
import java.util.concurrent.*;
public class StopThread {
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;
}
}
需要在程序执行的时候加上
-server参数,即: java -server StopThread 。虚拟机主要分两种模式一种是client模式一种是server模式,在win下默认是client模式。
以上的实验只有在server模式下,才能得到书中的结果。即线程不会退出。
如果这段代码在
server模式下执行,线程一直不会结束。因为没有同步stopRequested域,backgroundThread线程的stopRequested域是线程的一个拷贝,不能保证backgroundThread线程何时能"看到"主线程对stopRequested值的修改。并且虚拟机会对代码进行修改,以提升性能。将
while (!stopRequested)
i++;
修改为
if(!stopRequested)
while(true)
i++;
所以这段代码是一个死循环,线程一直得不到结束。
如果是在
client模式下,这段代码在backgroundThread开始后一秒左右线程就会结束。可能是主线程对stopRequest值的改变backgroundThread很快就"看到"了并且没有做上述的优化。所以client模式下,一秒后结束。
在server模式中如果把原来的代码改为
while(!stopRequested){
i++; System.out.println("i");
}
执行程序这时1秒后也会结束。可以猜测,添加了 System.out.println("i");代码后,jvm没有再对该段代码进行优化。并且主线程对stopRequest值的改变backgroundThread很快就"看到"了。所以在一秒后线程结束。
所以导致该代码在server模式下会死循环,主要是因为jvm对while部分的代码进行优化,在该程序中其实主线程对stopRequest的改变backgroundThread很快就看了。但是jvm并不保证backgroundThread线程能及时看到主线程对stopRequested值的修改。如果需要保证及时看到,可以给域加上volitile修饰。
volatile修饰符不执行互斥访问,但是它可以保证任何一个线程在读取该域的时候可以读取到最近被写入的值。
分享到:
相关推荐
《Effective Java》是Java开发领域的一本经典著作,由Joshua Bloch撰写,书中提出了一系列编程最佳实践和设计模式,帮助开发者写出更高效、更可靠、更易于维护的Java代码。配套代码`effective-java-examples-master`...
* 可避免JavaBean模式中的安全性问题:构造器模式可以确保对象在构造过程中处于一致状态。 * 可以使得参数设置变得清晰易懂:构造器模式可以使用fluent API的方式来构造对象,提高代码的可读性。 * 可以让代码具有很...
《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,该书的第三版继续提供了关于如何编写高效、优雅、可维护的Java代码的指导。以下是基于给出的目录和部分内容提取的一些关键知识点: ### 第一...
标题“effective-java.pdf”与描述“effective-java.pdf”表明本文档是关于Java编程实践的指南,且内容可能来自于一本名为《Effective Java》的书籍,该书是由Joshua Bloch编写,被广泛认为是Java编程的权威指南。...
在编程领域,特别是Java开发中,"Effective Java"是一本非常经典的书籍,由Joshua Bloch撰写,书中提出了一系列最佳实践和设计原则,以帮助开发者编写出更高效、更安全的代码。根据提供的标题和描述,我们将探讨三个...
《Effective Enterprise Java》也不例外,它旨在帮助开发者避免常见的陷阱,提升代码质量,并提高开发效率。书中的每个条目都是一个独立的建议,旨在解决实际开发中遇到的问题,这些条目通常以简洁明了的方式呈现,...
《Effective Java》是Java开发领域的经典著作,作者Joshua Bloch深入浅出地阐述了编写高效、健壮的Java代码的技巧和最佳实践。以下是对该书部分内容的详细解释: 1. **产生和销毁对象** - Item1:静态工厂方法相比...
本学习记录主要介绍了 Effective Java 3 中的静态工厂方法和 Builder 模式两部分内容。 一、静态工厂方法 静态工厂方法是指返回类实例的命名规则,例如:from、of、valueOf、instance 或 getinstance、create 或 ...
本书以若干条建议、揸南的形式,言简意赅地介绍了J2EE开发中的微妙之处。无论你是否是Java开发人员,本书都将为你开发高效的企业系统提供诸多帮助。“通过这本书,TedNeward将帮助你实现从一个优秀的Java企业应用...
《Effective Java》读书分享.pptx 是一本 Java 编程语言指南,旨在帮助开发者编写高质量、可维护的 Java 代码。该书包含 90 个条目,每个条目讨论一条规则,涵盖了 Java 编程语言的方方面面。 创建和销毁对象 在 ...
《Effective Enterprise Java》是一本由James Gosling、Bill Venners和Cay S. Horstmann合著的经典著作,旨在帮助Java开发者深入理解和利用企业级Java技术。这本书提供了78条具体的建议,涵盖了从设计模式到并发编程...
《Effective Java》是一本经典Java编程指南,作者是Joshua Bloch,这本书深入探讨了如何编写高质量、高效、可维护的Java代码。以下是对压缩包中各章节主要知识点的详细阐述: 1. **第2章 创建和销毁对象** - 单例...
这里我们将围绕"Effective-Java:Effective Java中文版第二版示例代码"这一主题,深入探讨书中的核心知识点。 1. **单例模式**:书中提倡使用`enum`实现单例,避免传统双重检查锁定(Double-Checked Locking)和静态...
《Effective Enterprise Java》通过深入剖析这些关键领域,提供了许多有价值的建议和技巧,以提高代码质量并降低维护成本。 1. **模块化设计**:书中强调了模块化设计的重要性,鼓励开发者使用接口和抽象类来定义...
以上只是《Effective Java》笔记中可能包含的部分关键知识点,实际笔记会更详细地探讨每个主题,并给出具体的代码示例和实践建议。通过深入学习这些内容,开发者可以提升自己的Java编程技艺,编写出更加高效、可维护...
这些只是《Effective Java》第三版中的一部分主题,全书涵盖了大量关于如何编写高质量Java代码的实用建议。通过阅读和实践书中的内容,开发者能够更好地掌握Java编程的最佳实践,从而提升自己的编程技艺。