1. 什么是栈封闭?安全
答:栈封闭是线程封闭的一种特例,在栈封闭中,只能经过局部变量才能访问对象。它们位于执行线程的栈中,其余线程没法访问这个栈。“栈封闭”是实现“线程封闭”的机制之一,而“线程封闭”和线程安全性相关。spa
2. 什么状况下对象引用的栈封闭性会被破坏”,破坏掉的后果是什么?线程
答:code
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逸出了。blog
因此:局部变量错误被发布出去了就会致使封闭性被破坏,并致使对象的逸出。作用域
3. 注:class
“逸出”是和线程安全相关的知识点,“逸出”是“发布”时的一种状况。test
“发布(Publish)”一个对象的意思是指,使对象可以在当前做用域以外的代码中使用。如:将一个指向该对象的引用保存到其余代码能够访问的地方,或者在某一个非私有的方法中返回该引用,或者将引用传递到其余类的方法中。变量
“逸出(Escape)”:当某个不该该发布的对象被发布了。(其实逸出就是将还没有完成构造的对象发布出去了,因此,避免对象逸出就须要确保对象已经完成初始化了再发布。)