摘要:引用逸出基于外部方法發(fā)布對(duì)象引出引用逸出問(wèn)題。并發(fā)編程實(shí)戰(zhàn)的提到私有構(gòu)造函數(shù)公共的工廠方法解決可能逸出的問(wèn)題。同理在構(gòu)造函數(shù)可以新建線程,當(dāng)不要。下面代碼就是錯(cuò)誤的可以在構(gòu)造函數(shù)中但是不要
java并發(fā)編程實(shí)戰(zhàn)的解釋,不夠詳細(xì),尤其this引用逸出讓人理解有些費(fèi)解,java并發(fā)編程實(shí)戰(zhàn)里面的內(nèi)容就直接拷貝過(guò)來(lái)
發(fā)布:使對(duì)象能夠在當(dāng)前作用域之外的代碼中使用 逸出:當(dāng)某個(gè)不該被發(fā)布的對(duì)象被發(fā)布時(shí),這種情況稱為逸出 發(fā)布內(nèi)部狀態(tài)將會(huì)破壞封裝性,并使得程序難以維持不變性條件 當(dāng)某個(gè)對(duì)象逸出后,必須對(duì)程序進(jìn)行分析,以便找出哪些對(duì)象或線程可能會(huì)誤用該對(duì)象,這正是使用封裝的最主要原因:使對(duì)程序的正確性分析變?yōu)榭赡?,并使無(wú)意中破壞設(shè)計(jì)約束條件變得更難 無(wú)論其它的線程會(huì)對(duì)逸出的對(duì)象引用執(zhí)行何種操作,都不重要,因?yàn)檎`用該引用的風(fēng)險(xiǎn)始終是客觀存在的發(fā)布的實(shí)現(xiàn)方式 1.對(duì)象引用作為非私有屬性
代碼示例:
//只是代碼示例,不推薦這樣初始化List public class test { public Listanimals = new ArrayList (){{ add(new Animal()); }}; }
List對(duì)象和List中的Animal對(duì)象都被發(fā)布出去。
2.對(duì)象引用被非私有方法返回代碼示例:
//只是代碼示例,不推薦這樣初始化List public class test { private Listanimals = new ArrayList (){{ add(new Animal()); }}; public List getAnimals(){ return animals; } }
1、2的一樣,List對(duì)象和List中的Animal對(duì)象發(fā)布出去。只是一個(gè)是方法發(fā)布出去,一個(gè)是屬性發(fā)布出去。
3.外部方法發(fā)布對(duì)象外部方法定義: 對(duì)當(dāng)前類來(lái)說(shuō),外部方法是指行為不完全由當(dāng)前類來(lái)規(guī)定的方法,包括其他類中定義的方法以及當(dāng)前類中可以被改寫的方法(既不是私有方法,也不是final方法)
代碼示例:
public class test { public void setAnimals(Animal animal){ animal.setDag( new Dog(){ public void doSomething(){ ... }; } ) } }
當(dāng)前類test來(lái)說(shuō),setDag為外部方法,Dog就被發(fā)布了。
this引用逸出基于外部方法發(fā)布對(duì)象引出this引用逸出問(wèn)題。直接拿java并發(fā)編程實(shí)戰(zhàn)的代碼
public class ThisEscape { public ThisEscape(EventSource source){ source.registerListener( new EventListener(){ public void onEvent(Event e){ doSomething(e) } }); } } java并發(fā)編程實(shí)戰(zhàn)的解釋: 當(dāng)ThisEscape發(fā)布EventListener時(shí),它也無(wú)條件地發(fā)布了封裝(enclosing)ThisEscape的實(shí)例,因?yàn)閮?nèi)引類(inner class inst ances)的實(shí)例包含了對(duì)封裝實(shí)例隱含的引用。
這里發(fā)布new EventListener()內(nèi)部對(duì)象,隱式的有個(gè)this。也就是ThisEscape也會(huì)被發(fā)布出去,但是ThisEscape還沒(méi)有構(gòu)建完成,存在逸出的可能,ThisEscape在未構(gòu)建完成被發(fā)布了。怎么處理這個(gè)可能逸出的問(wèn)題,就是讓ThisEscape構(gòu)建完成再發(fā)布出去就可以了。java并發(fā)編程實(shí)戰(zhàn)的提到私有構(gòu)造函數(shù)+公共的工廠方法解決可能逸出的問(wèn)題。
public class ThisEscape { private final EventListener listener; private ThisEscape(){ listener = new EventListener(){ public void onEvent(Event e){ doSomething(e) } }; } public static ThisEscape newInstance(EventSource source){ ThisEscape thisEscape = new ThisEscape(); source.registerListener(thisEscape.listener); return thisEscape; } }
同理在構(gòu)造函數(shù)可以新建線程,當(dāng)不要start()。start()的話this被新線程共享。下面代碼就是錯(cuò)誤的:
public class ThisEscape { private Thread thread; public ThisEscape(){ thread = new Thread(){ public void run(){ ... } }; thread.start(); //可以在構(gòu)造函數(shù)中new Thread 但是不要start } public static void main(String[] args){ ThisEscape a = new ThisEscape(); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/69062.html
摘要:每個(gè)會(huì)緩存主存的共享變量,從而提高處理效率。為當(dāng)前緩存行加入緩存一致性協(xié)議。任何修改,其他線程是可見(jiàn)的。修飾的變量還是會(huì)緩存的,只是通過(guò)一系列處理保證了所有線程看到這個(gè)變量的值是一致的 java并發(fā)編程實(shí)戰(zhàn)對(duì)volatile的解釋就是:當(dāng)一個(gè)域聲明為valatile類型后,編譯器與運(yùn)行時(shí)會(huì)監(jiān)視這個(gè)變量:它是共享的,而且對(duì)它的操作不會(huì)與其他的內(nèi)存操作一起被重排序。volatile變量不會(huì)...
摘要:是需要我們?nèi)ヌ幚砗芏嗍虑?,為了防止多線程給我們帶來(lái)的安全和性能的問(wèn)題下面就來(lái)簡(jiǎn)單總結(jié)一下我們需要哪些知識(shí)點(diǎn)來(lái)解決多線程遇到的問(wèn)題。 前言 不小心就鴿了幾天沒(méi)有更新了,這個(gè)星期回家咯。在學(xué)校的日子要努力一點(diǎn)才行! 只有光頭才能變強(qiáng) 回顧前面: 多線程三分鐘就可以入個(gè)門了! Thread源碼剖析 本文章的知識(shí)主要參考《Java并發(fā)編程實(shí)戰(zhàn)》這本書的前4章,這本書的前4章都是講解并發(fā)的基...
摘要:發(fā)布的對(duì)象內(nèi)部狀態(tài)可能會(huì)破壞封裝性,使程序難以維持不變性條件。不變性線程安全性是不可變對(duì)象的固有屬性之一??勺儗?duì)象必須通過(guò)安全方式來(lái)發(fā)布,并且必須是線程安全的或者有某個(gè)鎖保護(hù)起來(lái)。 線程的優(yōu)缺點(diǎn) 線程是系統(tǒng)調(diào)度的基本單位。線程如果使用得當(dāng),可以有效地降低程序的開發(fā)和維護(hù)等成本,同時(shí)提升復(fù)雜應(yīng)用程序的性能。多線程程序可以通過(guò)提高處理器資源的利用率來(lái)提升系統(tǒng)的吞吐率。與此同時(shí),在線程的使用...
摘要:對(duì)象的共享上一章介紹了如何通過(guò)同步來(lái)避免多個(gè)線程在同一時(shí)刻訪問(wèn)相同的數(shù)據(jù),而本章將介紹如何共享和發(fā)布對(duì)象,從而使它們能夠安全地由多個(gè)線程同時(shí)訪問(wèn)。為了確保多個(gè)線程的之間對(duì)內(nèi)存寫入操作的可見(jiàn)性,必須使用同步機(jī)制。 對(duì)象的共享 上一章介紹了如何通過(guò)同步來(lái)避免多個(gè)線程在同一時(shí)刻訪問(wèn)相同的數(shù)據(jù),而本章將介紹如何共享和發(fā)布對(duì)象,從而使它們能夠安全地由多個(gè)線程同時(shí)訪問(wèn)。 列同步代碼塊和同步方法可...
摘要:當(dāng)某個(gè)不應(yīng)該發(fā)布的對(duì)象被發(fā)布時(shí),這種情況被稱為逸出。線程安全共享線程安全的對(duì)象在其內(nèi)部實(shí)現(xiàn)同步,因此多線程可以通過(guò)對(duì)象的公有接口來(lái)進(jìn)行訪問(wè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)域用...
閱讀 897·2021-09-22 15:18
閱讀 1263·2021-09-09 09:33
閱讀 2820·2019-08-30 10:56
閱讀 1264·2019-08-29 16:30
閱讀 1557·2019-08-29 13:02
閱讀 1516·2019-08-26 13:55
閱讀 1702·2019-08-26 13:41
閱讀 2017·2019-08-26 11:56