摘要:發(fā)布對(duì)像定義是一個(gè)對(duì)象能夠被當(dāng)前范圍之外的代碼所使用對(duì)象溢出一種錯(cuò)誤的發(fā)布。構(gòu)造函數(shù)可以將引用保存到某個(gè)地方,只要其他線程不會(huì)在構(gòu)造函數(shù)完成之前使用它
發(fā)布對(duì)像
定義: 是一個(gè)對(duì)象能夠被當(dāng)前范圍之外的代碼所使用對(duì)象溢出
一種錯(cuò)誤的發(fā)布。當(dāng)一個(gè)對(duì)象該沒有構(gòu)造完成時(shí),就使被其他線程所見。
下面我們來(lái)看一下沒有安全發(fā)布的對(duì)象
@Slf4j public class UnsafePublish { private String[] states = {"a", "b", "c"}; public String[] getStates() { return states; } public static void main(String[] args) { UnsafePublish unsafePublish = new UnsafePublish(); log.info("{}", Arrays.toString(unsafePublish.getStates())); unsafePublish.getStates()[0] = "d"; log.info("{}", Arrays.toString(unsafePublish.getStates())); } }
我們看這段代碼,我們創(chuàng)建了一個(gè)對(duì)象通過getStates方法我們可以獲取這個(gè)對(duì)象的數(shù)組,此時(shí)我們將數(shù)組內(nèi)容打印出來(lái)結(jié)果,如果此時(shí)我們將這個(gè)對(duì)象發(fā)布出去,然后其他線程(這里沒有模擬其他線程對(duì)其修改)又對(duì)這個(gè)對(duì)象的states的值進(jìn)行修改,此時(shí)在拿到這個(gè)對(duì)象的期望的是沒有被修改的,事實(shí)上得到的對(duì)象是修改過后的。也就是說(shuō)我們不能直接通過一個(gè)public的一個(gè)set方法就行return。
下面我們?cè)倏匆欢螌?duì)象溢出的代碼
public class ThisEscape { public ThisEscape(EventSource source) { source.registerListener(new EventListener() { public void onEvent(Event e) { doSomething(e); } }); } void doSomething(Event e) { } interface EventSource { void registerListener(EventListener e); } interface EventListener { void onEvent(Event e); } interface Event { } }
這將導(dǎo)致this逸出,所謂逸出,就是在不該發(fā)布的時(shí)候發(fā)布了一個(gè)引用。在這個(gè)例子里面,當(dāng)我們實(shí)例化ThisEscape對(duì)象時(shí),會(huì)調(diào)用source的registerListener方法,這時(shí)便啟動(dòng)了一個(gè)線程,而且這個(gè)線程持有了ThisEscape對(duì)象(調(diào)用了對(duì)象的doSomething方法),但此時(shí)ThisEscape對(duì)象卻沒有實(shí)例化完成(還沒有返回一個(gè)引用),所以我們說(shuō),此時(shí)造成了一個(gè)this引用逸出,即還沒有完成的實(shí)例化ThisEscape對(duì)象的動(dòng)作,卻已經(jīng)暴露了對(duì)象的引用。其他線程訪問還沒有構(gòu)造好的對(duì)象,可能會(huì)造成意料不到的問題。
public class SafeListener { private final EventListener listener; private SafeListener() { listener = new EventListener() { public void onEvent(Event e) { doSomething(e); } }; } public static SafeListener newInstance(EventSource source) { SafeListener safe = new SafeListener(); source.registerListener(safe.listener); return safe; } void doSomething(Event e) { } interface EventSource { void registerListener(EventListener e); } interface EventListener { void onEvent(Event e); } interface Event { } }
在這個(gè)例子中我們使用匿名類的形式來(lái)構(gòu)造,只有在整個(gè)對(duì)象都實(shí)例化好了才能會(huì)執(zhí)行。只有當(dāng)構(gòu)造函數(shù)返回時(shí),this引用才應(yīng)該從線程中逸出。構(gòu)造函數(shù)可以將this引用保存到某個(gè)地方,只要其他線程不會(huì)在構(gòu)造函數(shù)完成之前使用它
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74490.html
摘要:當(dāng)某個(gè)不應(yīng)該發(fā)布的對(duì)象被發(fā)布時(shí),這種情況被稱為逸出。線程安全共享線程安全的對(duì)象在其內(nèi)部實(shí)現(xiàn)同步,因此多線程可以通過對(duì)象的公有接口來(lái)進(jìn)行訪問而不需要進(jìn)一步的同步。 前言 本系列博客是對(duì)《Java并發(fā)編程實(shí)戰(zhàn)》的一點(diǎn)總結(jié),本篇主要講解以下幾個(gè)內(nèi)容,內(nèi)容會(huì)比較枯燥??赡艽蠹铱礃?biāo)題不能能直觀的感受出到底什么意思,這就是專業(yè)術(shù)語(yǔ),哈哈,解釋下,術(shù)語(yǔ)(terminology)是在特定學(xué)科領(lǐng)域用...
摘要:復(fù)制這一工作所花費(fèi)的時(shí)間,在對(duì)象存活率達(dá)到一定程度時(shí),將會(huì)變的不可忽視。針對(duì)老年代老年代的特點(diǎn)是區(qū)域較大,對(duì)像存活率高。這種情況,存在大量存活率高的對(duì)像,復(fù)制算法明顯變得不合適。 GC(Garbage Collection)即Java垃圾回收機(jī)制,是Java與C++的主要區(qū)別之一,作為Java開發(fā)者,一般不需要專門編寫內(nèi)存回收和垃圾清理代碼,對(duì)內(nèi)存泄露和溢出的問題,也不需要像C++程序...
小編寫這篇文章的一個(gè)主要目的,主要是給大家去做一個(gè)科普,解釋關(guān)于python中的一些相關(guān)的用法實(shí)例,包括介紹了python Requests請(qǐng)求方法,還有一些具體用法的詳細(xì)解釋,具體內(nèi)容,下面小編給大家詳細(xì)的解答?! ∫?、requests request的說(shuō)法網(wǎng)上有很多,簡(jiǎn)單來(lái)說(shuō)就是就是python里的很強(qiáng)大的類庫(kù),可以幫助你發(fā)很多的網(wǎng)絡(luò)請(qǐng)求,比如get,post,put,delete等等,...
摘要:并發(fā)數(shù)據(jù)結(jié)構(gòu)存在的理由串行數(shù)據(jù)結(jié)構(gòu)在并發(fā)環(huán)境下是不安全的,而直接使用鎖又會(huì)帶來(lái)性能的影響,所以專門設(shè)計(jì)了針對(duì)并發(fā)環(huán)境下的數(shù)據(jù)結(jié)構(gòu),其中使用了無(wú)鎖運(yùn)算來(lái)保證性能。在高并發(fā)的情況下過多的鎖操作會(huì)拖累系統(tǒng)的性能。是由數(shù)組結(jié)構(gòu)和數(shù)組結(jié)構(gòu)組成。 【并發(fā)數(shù)據(jù)結(jié)構(gòu)存在的理由 串行數(shù)據(jù)結(jié)構(gòu)在并發(fā)環(huán)境下是不安全的,而直接使用鎖又會(huì)帶來(lái)性能的影響,所以jdk專門設(shè)計(jì)了針對(duì)并發(fā)環(huán)境下的數(shù)據(jù)結(jié)構(gòu),其中使用了無(wú)...
閱讀 2433·2023-04-26 00:46
閱讀 594·2023-04-25 21:36
閱讀 738·2021-11-24 10:19
閱讀 2283·2021-11-23 09:51
閱讀 1029·2021-10-21 09:39
閱讀 842·2021-09-22 10:02
閱讀 1677·2021-09-03 10:29
閱讀 2709·2019-08-30 15:53