什么是栈封闭?什么情况下对象引用的栈封闭性会…
2019-11-21 08:32:39来源:博客园 阅读 ()
什么是栈封闭?什么情况下对象引用的栈封闭性会被破坏”,破坏掉的后果是什么?
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)”:当某个不应该发布的对象被发布了。(其实逸出就是将尚未完成构造的对象发布出去了,所以,避免对象逸出就需要确保对象已经完成初始化了再发布。)
原文链接:https://www.cnblogs.com/laipimei/p/11888275.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 5月到6月程序员到底经历了和什么,工资狂跌***元,你是否也 2020-06-10
- 为什么阿里巴巴Java开发手册中不允许魔法值出现在代码中? 2020-06-09
- 计算机基础到底是哪些基础?为什么很重要! 2020-06-08
- 为什么阿里巴巴Java开发手册中强制要求接口返回值不允许使用 2020-06-06
- 高手眼中的观察者模式有什么不一样 2020-06-05
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash