`
atell
  • 浏览: 161639 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

试验《Java并发编程实践》3.2的"不要让this在构造期间逸出"

阅读更多
import java.io.IOException;

public class Demo {

    public Demo(T1 t1){
        t1.demo = this;// 将this在构造期间就逸出,这样逸出的对象被认为是“没有正确构建的(not properly constructed)”
        try {
            Thread.sleep(100000000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void print() {
        System.out.println("demo's method");
    }

    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
        T1 t1 = new T1();
        t1.start();
        new Demo(t1);
    }

    static class T1 extends Thread {
        public Demo demo;
        public void run() {
            while (true) {
                if (demo != null) {// 事实证明,即使Demo的构造方法未执行完,this赋值给T1.demo后,不为null
                    demo.print();// 且能够正常使用demo的实例方法。至于由于demo的构造方法未执行完会带来什么不稳定的影响,应该是指它可能未按照预期的去初始化一些数据。
                }
                try {
                    Thread.sleep(1000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

 

 

实验表明: this在构造期间(未完成构造)可以逸出,并且看起来使用很正常,但使用“没有构造完全的对象”,会有隐患,这就是书里想说的道理。

 

 

上面的例子,讲述“逸出”的例子,但是它没有展现出“逸出”的危害。

下面将展示“逸出”的危害,它将final域的默认值给打印了出来。

 

import java.io.IOException;

public class Demo {

    final int x;
    public Demo(T1 t1){
        t1.demo = this;// 将this在构造期间就逸出,这样逸出的对象被认为是“没有正确构建的(not properly constructed)”
        try {
            Thread.sleep(100000000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        x=9;
    }

    public void print() {
        System.out.println(this.x);
    }

    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
        T1 t1 = new T1();
        t1.start();
        new Demo(t1);
    }

    static class T1 extends Thread {
        public Demo demo;
        public void run() {
            while (true) {
                if (demo != null) {
                    demo.print();
                }
                try {
                    Thread.sleep(1000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}
 

打印了:

0
0
0
0
0

....

 

 

分享到:
评论

相关推荐

    java并发编程实践高清中文版+源码

    《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序...在《JAVA并发编程实践》中,这些便利工具的创造者不仅解释了它们究竟如何工作、如何使用,还阐释了创造它们的原因,及其背后的设计模式。

    JAVA并发编程实践.pdf+高清版+目录 书籍源码

    《JAVA并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。它涵盖了Java并发的核心概念、工具和最佳实践,旨在帮助读者在多线程环境下编写高效、安全的代码。 并发编程是现代软件开发中的关键技能,...

    Java并发编程实践高清pdf及源码

    《Java并发编程实践》是一本深入探讨Java多线程编程的经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等专家共同编写。这本书全面介绍了Java平台上的并发编程技术,是Java开发...

    JAVA并发编程实践

    《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序...在《JAVA并发编程实践》中,这些便利工具的创造者不仅解释了它们究竟如何工作、如何使用,还阐释了创造它们的原因,及其背后的设计模式。

    java并发编程实践pdf笔记

    Java并发编程实践是Java开发中不可或缺的一个领域,它涉及到如何高效、正确地处理多线程环境中的任务。这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的...

    java并发编程实践(中文版pdf全部40M分2部分上传)2

    《JAVA并发编程实践》既能够成为读者的理论支持,又可以作为...《JAVA并发编程实践》适合于具有一定Java编程经验的程序员、希望了解Java SE 5以及6在线程技术上的改进和新特性的程序员,以及Java和并发编程的爱好者。

    JAVA并发编程实践.pdf

    《JAVA并发编程实践》适合于具有一定Java编程经验的程序员、希望了解Java SE 5以及6在线程技术上的改进和新特性的程序员,以及Java和并发编程的爱好者。 作者简介 作者:(美)戈茨 等 本书作者系lava标准化组织...

    java并发编程实践

    在Java并发编程实践中,首先需要理解“并发”与“并行”的区别。“并发”指的是多个任务同时进行,但实际上可能是在多线程环境下通过交替执行的方式实现的;而“并行”则是指多个任务在同一时刻真正同时执行,通常...

    Java并发编程实践.pdf

    ### Java并发编程实践 #### 一、并发编程基础 ##### 1.1 并发与并行的区别 在Java并发编程中,首先需要理解“并发”(Concurrency)和“并行”(Parallelism)的区别。“并发”指的是多个任务在同一时间段内交替...

    JAVA并发编程实践 pdf

    《JAVA并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发编程是现代软件开发中的核心主题,尤其是在多核处理器普及的今天,利用好并发能够显著提升程序的执行效率和系统性能。这本书以实践为...

    [Java并发编程实践].(Java.Concurrency.in.Practice).Brian.Goetz.英文原版.pdf

    ### Java并发编程实践 #### 书籍概述 《Java并发编程实践》是一本由Brian Goetz等人编写的关于Java并发编程的经典著作。本书深入浅出地介绍了Java 5.0及之后版本中新增加的并发特性,并对并发编程进行了全面而详尽...

    Java并发编程实践-电子书

    Java并发编程实践-电子书-01章.pdf Java并发编程实践-电子书-02章.pdf Java并发编程实践-电子书-03章.pdf Java并发编程实践-电子书-04章.pdf Java并发编程实践-电子书-05章.pdf Java并发编程实践-电子书-06章.pdf ...

    Java 并发编程实战.pdf

    在Java平台上,由于其本身提供了强大的并发编程支持,因此,掌握并发编程对于提高Java应用的性能和响应能力至关重要。 书中会首先介绍Java并发编程的基础知识,包括线程的创建和运行,同步机制的基本用法,以及Java...

    java并发编程实践(第一版)

    《Java并发编程实践》是关于Java语言在并发编程领域的实践指南,作者在本书中详细介绍了在Java编程中,如何高效地实现多线程程序的设计和开发。本书不仅为初学者提供了理论基础,还为有经验的开发者提供了优化并发...

Global site tag (gtag.js) - Google Analytics