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

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

相关文章

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

golang 对象池sync.Pool的实现

《golang对象池sync.Pool的实现》:本文主要介绍golang对象池sync.Pool的实现,用于缓存和复用临时对象,以减少内存分配和垃圾回收的压力,下面就来介绍一下,感兴趣的可以了解... 目录sync.Pool的用法原理sync.Pool 的使用示例sync.Pool 的使用场景注意sync.

宝塔安装的MySQL无法连接的情况及解决方案

《宝塔安装的MySQL无法连接的情况及解决方案》宝塔面板是一款流行的服务器管理工具,其中集成的MySQL数据库有时会出现连接问题,本文详细介绍两种最常见的MySQL连接错误:“1130-Hostisn... 目录一、错误 1130:Host ‘xxx.xxx.xxx.xxx’ is not allowed