什麼是棧封閉?什麼情況下物件引用的棧封

2022-08-24 23:36:16 字數 802 閱讀 4027

1. 什麼是棧封閉?

答:棧封閉是執行緒封閉的一種特例,在棧封閉中,只能通過區域性變數才能訪問物件。它們位於執行執行緒的棧中,其他執行緒無法訪問這個棧。「棧封閉」是實現「執行緒封閉」的機制之一,而「執行緒封閉」和執行緒安全性相關。

2. 什麼情況下物件引用的棧封閉性會被破壞」,破壞掉的後果是什麼?

答:1     private arraylistanimals; //成員變數

2     public void test()

上面這段**執行到 "animals.add(cat); " 時,cat物件逸出了(「逸出」這一概念在注釋中做了解釋),即cat物件引用的棧封閉性被破壞了。

為什麼說cat物件逸出了呢?看**我們可以知道animals是成員變數,是支援多個執行緒同時訪問的共享資料。當**執行到「animals.add(cat); 」時,除了當前執行緒外,其他執行緒也能同時通過animals來訪問到cat,你並不能保證其他執行緒同時會對cat做什麼訪問操作,所以cat在這裡被不正確地發布了,即cat逸出了。

所以:區域性變數錯誤被發布出去了就會導致封閉性被破壞,並導致物件的逸出。

3. 注:

「逸出」是和執行緒安全相關的知識點,「逸出」是「發布」時的一種情況。

「發布(publish)」乙個物件的意思是指,使物件能夠在當前作用域之外的**中使用。如:將乙個指向該物件的引用儲存到其他**可以訪問的地方,或者在某乙個非私有的方法中返回該引用,或者將引用傳遞到其他類的方法中。

「逸出(escape)」:當某個不應該發布的物件被發布了。(其實逸出就是將尚未完成構造的物件發布出去了,所以,避免物件逸出就需要確保物件已經完成初始化了再發布。)

什麼情況下使用指標的引用

先明確一下指標的概念,指標存放的是變數的位址。在函式呼叫時用指標做引數,表示把變數的位址傳遞給子函式。但是子函式只能修改指標所指的變數的值,並不能修改指標的指向。如果想要修改指標的指向,就要用指標的引用 指標的指標也可以,但是這裡只談指標的引用 先拿最簡單的main函式裡的變數來舉例子 includ...

什麼是IT人力外包?什麼情況下選用IT人力外包?

什麼是it人力外包?什麼情況下選用it人力外包?在it企業中,在工作中通常涉及的外包業務主要有三類形式,概括來說 一 專案外包 有明確的專案目標 時間要求 產出交付標準,請有相關資質的乙方公司幫助完成,付費方式通常為按約定的專案階段 達成的交付產出分期支付,最後在專案上線執行後可能還會留少量比例的尾...

什麼情況下用遞迴?

遞迴的特點,可以看出遞迴可以大大縮短程式的 有意識的使用遞迴,可以用較短的 解決一些複雜的問題。甚至有些問題非得使用遞迴解決不可。那麼什麼時候我們該使用遞迴呢?遞迴演算法的 基本思想 是 把規模大的 較難解決的問題變成規模較小的 易解決的同一問題。規模較小的問題又變成規模更小的問題,並且小到一定程度...