什么是栈封闭?什么情况下对象引用的栈封...

2024-05-13 11:08
文章标签 引用 对象 情况 封闭

本文主要是介绍什么是栈封闭?什么情况下对象引用的栈封...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 什么是栈封闭?

  答:栈封闭是线程封闭的一种特例,在栈封闭中,只能通过局部变量才能访问对象。它们位于执行线程的栈中,其他线程无法访问这个栈。“栈封闭”是实现“线程封闭”的机制之一,而“线程封闭”和线程安全性相关。


  2. 什么情况下对象引用的栈封闭性会被破坏”,破坏掉的后果是什么?

  答:

1     private ArrayList<Animal> animals; //成员变量
2     public void test() {
3       Animal cat = new Animal("小花猫"); //局部变量
4       animals.add(cat); 
5       cat.setAge(1);
6     }
  上面这段代码执行到 "animals.add(cat); " 时,cat对象逸出了(“逸出”这一概念在注释中做了解释),即cat对象引用的栈封闭性被破坏了。

  为什么说cat对象逸出了呢?看代码我们可以知道animals是成员变量,是支持多个线程同时访问的共享数据。当代码执行到“animals.add(cat); ”时,除了当前线程外,其他线程也能同时通过animals来访问到cat,你并不能保证其他线程同时会对cat做什么访问操作,所以cat在这里被不正确地发布了,即cat逸出了。

  所以:局部变量错误被发布出去了就会导致封闭性被破坏,并导致对象的逸出。



  3. 注:

  “逸出”是和线程安全相关的知识点,“逸出”是“发布”时的一种情况。

  “发布(Publish)”一个对象的意思是指,使对象能够在当前作用域之外的代码中使用。如:将一个指向该对象的引用保存到其他代码可以访问的地方,或者在某一个非私有的方法中返回该引用,或者将引用传递到其他类的方法中。

  “逸出(Escape)”:当某个不应该发布的对象被发布了。(其实逸出就是将尚未完成构造的对象发布出去了,所以,避免对象逸出就需要确保对象已经完成初始化了再发布。)
更多学习资料可关注gzitcast获取(weiixn)

这篇关于什么是栈封闭?什么情况下对象引用的栈封...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/985534

相关文章

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使

MyBatis的配置对象Configuration作用及说明

《MyBatis的配置对象Configuration作用及说明》MyBatis的Configuration对象是MyBatis的核心配置对象,它包含了MyBatis运行时所需的几乎所有配置信息,这个对... 目录MyBATis配置对象Configuration作用Configuration 对象的主要作用C

SpringBoot实现导出复杂对象到Excel文件

《SpringBoot实现导出复杂对象到Excel文件》这篇文章主要为大家详细介绍了如何使用Hutool和EasyExcel两种方式来实现在SpringBoot项目中导出复杂对象到Excel文件,需要... 在Spring Boot项目中导出复杂对象到Excel文件,可以利用Hutool或EasyExcel

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C