`

并发编程实践笔记——对象的共享之发布与逸出

 
阅读更多

发布 

        对象的发布是指:使对象能够在当前作用域之外的代码中使用。例如在一个非私有的方法中将私有属性的对象引用直接返回。

 

逸出

        是指当某个不该被发布的对象被发布出去。例如,如果在对象完成构造之前就将其发布出去,就会破坏线程安全性。

 

警惕this引用逸出。当从对象的构造函数中发布对象的时候,只是发布了一个未构造完成的对象。在构造过程中使用this引用逸出的一个常见的现象是:在构造函数中启动一个线程,无论是显式创建(将它传递给构造函数)还是隐式创建(由于Thread或者Runable是该对象的一个内部类),this引用都会被新创建的线程共享。对应this应用逸出的方法是,将构造函数声明为私有,同时提供一个工厂方法提供对象,在工厂方法中完成构造并且发布。

 

安全发布的常用模式 

要安全的发布一个对象,对象的引用及对象的状态必须同时对其他线程可见

  • 在静态初始化函数中初始化一个对象的引用(由于静态初始化器由JVM在类的初始化阶段机型,由于JVM内部存在同步机制,因此通过此方式初始化的任何对象都可以被安全的发布)。
  • 将对象的引用保存在volatile类型域或者AtomReference对象中。
  • 将对象的引用保存到某个正确构造对象的final类型域中。
  • 将对象的引用保存到一个由锁保护的域中(比如Vector或者synchronizedList之类的线程安全的容器)。
分享到:
评论

相关推荐

    L1导论——笔记.pptx

    根据提供的文件信息,我们可以归纳出以下关键知识点,这些知识点涵盖了分布式系统...以上总结涵盖了L1导论——笔记.pptx文件中的主要内容,包括分布式系统的基本概念、面临的挑战、课程安排以及MapReduce的工作原理等。

    很好的计算机考研笔记

    与“和考研的朋友一起分享一下”相呼应,这份笔记具有极高的共享价值,旨在促进考生之间的交流,共同提高学习效率。 【标签】"和大家分享一下"进一步强调了这份资料的分享性质,意味着它不仅仅是一份个人的学习笔记...

    Linux网络编程笔记(修订版)

    ### Linux网络编程笔记(修订版) #### 基本概念 ...通过以上内容的学习和实践,可以更加深入地理解Linux网络编程的基本概念、常用接口以及常见的服务器模型,并能够编写出稳定高效的网络应用程序。

    Java,JVM相关笔记的代码知识

    线程同步和通信(如synchronized、wait/notify、锁等)是Java并发编程的核心内容。 这些知识点涵盖了JVM的基本概念和高级特性。通过深入研究和实践这些代码资源,开发者可以更好地理解和优化Java应用程序,提升系统...

    局域网通讯工具——飞秋(java)

    Java是一种面向对象的、跨平台的编程语言,由Sun Microsystems公司于1995年发布。它的设计目标是“一次编写,到处运行”,这意味着用Java编写的程序可以在任何支持Java的平台上运行,无需重新编译。这种特性使得Java...

    c99 学习笔记

    在标签“C 语言,编程”中,我们得到了文档涵盖的主要领域——C语言编程。C语言作为历史上最流行的编程语言之一,它对现代计算机科学产生了深远的影响。C语言以其接近硬件的操作能力和灵活性闻名,广泛应用于系统...

    Hive大数据仓库-笔记整理 (一)2020年最新版.pdf

    它构建在Hadoop之上,能够将SQL(结构化查询语言)转换为MapReduce任务,使得非程序员也能方便地操作和查询大数据。以下是关于Hive的一些核心知识点: 1. **Hive架构**:Hive由多个组件组成,包括Hive Server、...

    《ORANGE’S:一个操作系统的实现》读书笔记(二十四)进程间通信(二)文章代码

    《ORANGE’S:一个操作系统的实现》这本书深入浅出地介绍了操作系统的设计与实现,其中第24章主要探讨了进程间通信的第二部分。在这一章节中,作者可能会涉及多种IPC机制,包括管道、信号量、消息队列、共享内存等,...

    嵌入式Linux入门笔记

    9. **网络编程**:涵盖网络编程基础知识、服务器和客户端程序开发,以及利用IO复用实现高效并发处理。 10. **系统时间的实现**:讲解如何在嵌入式Linux系统中管理和实现精确的时间同步。 11. **关于进程的体会**:...

    嵌入式入门笔记(阿南)

    ### 嵌入式Linux入门知识点详解 ...通过以上内容可以看出,《嵌入式入门笔记(阿南)》不仅是一份详细的嵌入式Linux学习资料,也是一本实践性强的参考手册,适合初学者和有一定经验的开发者参考学习。

    java虚拟机笔记及代码.zip

    7. **多线程**:JVM支持多线程编程,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈,共享堆内存。线程同步和通信机制如synchronized关键字、wait()、notify()方法以及Lock接口,是实现并发的关键。 8. **类...

    Android-Study:Android 学习笔记

    《Android学习笔记——Java编程基础与实战应用》 在Android开发领域,Java语言扮演着至关重要的角色。Android Studio是Google官方推荐的开发环境,而它主要支持的就是Java语言。本篇将深入探讨Java编程基础以及如何...

    vc制作的C/S局域网聊天软件。毕业设计专用

    1. **C++编程基础**:理解类、对象、继承、多态等面向对象编程概念。 2. **网络编程**:学习TCP/IP协议,使用Winsock API进行网络通信,处理连接、发送和接收数据。 3. **多线程编程**:实现实时聊天可能需要同时...

    班级网站论文,(毕业设计范文)

    班级网站是一个集信息发布、资源共享、互动交流于一体的网络平台,对于学生和教师来说,它提供了便捷的沟通渠道,增强了班级的凝聚力。在毕业设计中,构建一个班级网站是一个常见的实践项目,能帮助学生将所学的IT...

    eMule-VeryCD-src.rar_VeryCD_cryptlib

    《eMule-VeryCD-src.rar_VeryCD_cryptlib:深入解析VeryCD电驴的源码与cryptlib加密库》 在IT领域,开源软件的源代码是开发者们宝贵的资源,它们为学习、研究和创新提供了无尽的可能。今天我们将深入探讨一个特别的...

    哈尔滨工业大学计算机系统期末复习数字资料.zip

    6. **编译器与汇编语言**:学习汇编语言编程,了解编译器的作用和工作流程,包括词法分析、语法分析、语义分析和代码生成阶段。 7. **操作系统**:深入理解操作系统的五大功能——进程管理、内存管理、文件系统、I/...

    java虚拟机源码-openjdk7:openjdk7源码(深入理解java虚拟机,读书笔记)

    Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了跨平台的运行环境。OpenJDK是Java Development Kit(JDK)的一个开源实现,由甲骨文公司和全球开发者社区共同维护。OpenJDK7是OpenJDK项目的一个...

Global site tag (gtag.js) - Google Analytics