安全發布對像

2021-09-24 07:00:16 字數 1697 閱讀 2033

發布對像

定義: 是乙個物件能夠被當前範圍之外的**所使用

物件溢位
一種錯誤的發布。當乙個物件該沒有構造完成時,就使被其他執行緒所見。

下面我們來看一下沒有安全發布的物件

@slf4j

public

class

unsafepublish

; public string getstates()

public

static

void

main

(string args)

", arrays.tostring(unsafepublish.getstates()));

unsafepublish.getstates()[0] = "d";

log.info("{}", arrays.tostring(unsafepublish.getstates()));

}}複製**

我們看這段**,我們建立了乙個物件通過getstates方法我們可以獲取這個物件的陣列,此時我們將陣列內容列印出來結果,如果此時我們將這個物件發布出去,然後其他執行緒(這裡沒有模擬其他執行緒對其修改)又對這個物件的states的值進行修改,此時在拿到這個物件的期望的是沒有被修改的,事實上得到的物件是修改過後的。也就是說我們不能直接通過乙個public的乙個set方法就行return。

下面我們再看一段物件溢位的**

public

class

thisescape

});}

void

dosomething

(event e)

inte***ce

eventsource

inte***ce

eventlistener

inte***ce

event

}複製**

這將導致this逸出,所謂逸出,就是在不該發布的時候發布了乙個引用。在這個例子裡面,當我們例項化thisescape物件時,會呼叫source的registerlistener方法,這時便啟動了乙個執行緒,而且這個執行緒持有了thisescape物件(呼叫了物件的dosomething方法),但此時thisescape物件卻沒有例項化完成(還沒有返回乙個引用),所以我們說,此時造成了乙個this引用逸出,即還沒有完成的例項化thisescape物件的動作,卻已經暴露了物件的引用。其他執行緒訪問還沒有構造好的物件,可能會造成意料不到的問題。

public

class

safelistener

};}

public

static safelistener newinstance

(eventsource source)

void

dosomething

(event e)

inte***ce

eventsource

inte***ce

eventlistener

inte***ce

event

}複製**

在這個例子中我們使用匿名類的形式來構造,只有在整個物件都例項化好了才能會執行。只有當建構函式返回時,this引用才應該從執行緒中逸出。建構函式可以將this引用儲存到某個地方,只要其他執行緒不會在建構函式完成之前使用它

歷史對像(版本對像)

什麼叫歷史物件 版本對像 自己取乙個的名字,不知道是否有專業的名稱了 在一些系統中我們經常會碰到處理的物件是歷史物件的問題 比方說我們有乙個訂單 訂單裡有多個產品,然後使用者可能會修改這個產品 比如說,名稱,稅收,用哲學的語言就是今天的我不是昨天的我。哪麼我們認為這個東西就是歷史對像了,訂單關聯的是...

Microsoft XMLHTTP對像屬性

msxml中提供了microsoft.xmlhttp物件,能夠完成從資料報到request物件的轉換以及傳送任務。建立xmlhttp物件的語句如下 set objxml createobject msxml2.xmlhttp 或 物件建立後呼叫open方法對request物件進行初始化,語法格式為 ...

對像相同賦值

using system using system.collections.generic using system.linq using system.text using system.reflection namespace bmw.core.common public static list...