欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-14 09:15:28
1. 什么是栈封闭? 答:栈封闭是线程封闭的一种特例,在栈封闭中,只能通过局部变量才能访问对象。它们位于执行线程的栈中,其他线程无法访问这个栈。“栈封闭”是实现“线程封闭”的机制之一,而“线程封闭”和线程安全性相关。 2. 什么情况下对象引用的栈封闭性会被破坏”,破坏掉的后果是什么? 答: 1 pr ......

  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)”:当某个不应该发布的对象被发布了。(其实逸出就是将尚未完成构造的对象发布出去了,所以,避免对象逸出就需要确保对象已经完成初始化了再发布。)