亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

java如何理解隱式地使this引用逸出

java如何理解隱式地使this引用逸出

MYYA 2019-05-25 15:54:28
這是《Java并發編程實戰》3.2發布與逸出一節中的示例代碼。我無法理解,this是怎么逸出的。//隱式地使this引用逸出(不要這么做)publicclassThisEscape{publicThisEscape(EventSourcesource){source.registerListener(newEventListener(){publicvoidonEvent(Evente){doSomething(e);}});}}書上說,當ThisEscape發布EventListener時,也隱含地發布了ThisEscape實例本身,因為在這個內部類的實例中包含了對ThisEscape實例的隱含引用。
查看完整描述

2 回答

?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

最近在看《Java并發編程實戰》,個人的理解:首先,看里面的doSomething(e)方法,這個方法應該是在ThisEscape中,不然就無法解釋。也就是說,通過doSomething(e)方法可以修改ThisEscape中的屬性或者調用ThisEscape中的其他方法。例子中的代碼,在多線程環境下,會出現這樣一種情況:線程A和線程B同時訪問ThisEscape構造方法,這時線程A訪問構造方法還為完成(可以理解為ThisEscape為初始化完全),此時由于this逸出,導致this在A和B中都具有可見性,線程B就可以通過this訪問doSomething(e)方法,導致修改ThisEscape的屬性。也就是在ThisEscape還為初始化完成,就被其他線程讀取,導致出現一些奇怪的現象。這也就是this逸出。通過《Java并發編程實戰》官網的書本example源碼包,也證實了doSomething的確是ThisEscape中的方法。
packagenet.jcip.examples;
/**
*ThisEscape
*

*Implicitlyallowingthethisreferencetoescape
*
*@authorBrianGoetzandTimPeierls
*/
publicclassThisEscape{
publicThisEscape(EventSourcesource){
source.registerListener(newEventListener(){
publicvoidonEvent(Evente){
doSomething(e);
}
});
}
voiddoSomething(Evente){
}
interfaceEventSource{
voidregisterListener(EventListenere);
}
interfaceEventListener{
voidonEvent(Evente);
}
interfaceEvent{
}
}
JavaConcurrencyinPractice
                            
查看完整回答
反對 回復 2019-05-25
?
翻閱古今

TA貢獻1780條經驗 獲得超5個贊

實話實說多線程、逸出我不是很懂,但是我懂內部類,所以可以來強答一下,內部類、匿名內部類都可以訪問外部類的對象的域,為什么會這樣,實際上是因為內部類構造的時候,會把外部類的對象this隱式的作為一個參數傳遞給內部類的構造方法,這個工作是編譯器做的,他會給你內部類所有的構造方法添加這個參數,所以你例子里的匿名內部類在你構造ThisEscape時就把ThisEscape創建的對象隱式的傳給匿名內部類了。至于這樣會出什么問題我并不明白,貌似是怕onEvent會操作外部類的私有域?這部分需要你來教我了
                            
查看完整回答
反對 回復 2019-05-25
  • 2 回答
  • 0 關注
  • 823 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號