成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

【java】知識(shí)系譜-基礎(chǔ)篇-線程-發(fā)布、逸出

時(shí)飛 / 2601人閱讀

摘要:引用逸出基于外部方法發(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 List animals = new ArrayList(){{
        add(new Animal());
    }};
}

List對(duì)象和List中的Animal對(duì)象都被發(fā)布出去。

2.對(duì)象引用被非私有方法返回

代碼示例:

//只是代碼示例,不推薦這樣初始化List
public class test {
    private List animals = 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

相關(guān)文章

  • java知識(shí)系譜-基礎(chǔ)-線程-volatile

    摘要:每個(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ì)...

    _ivan 評(píng)論0 收藏0
  • 線程基礎(chǔ)必要知識(shí)點(diǎn)!看了學(xué)習(xí)多線程事半功倍

    摘要:是需要我們?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ā)的基...

    YPHP 評(píng)論0 收藏0
  • 【J2SE】java并發(fā)編程實(shí)戰(zhàn) 讀書筆記( 一、二、三章)

    摘要:發(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í),在線程的使用...

    QLQ 評(píng)論0 收藏0
  • <java并發(fā)編程實(shí)戰(zhàn)>學(xué)習(xí)二

    摘要:對(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)。 列同步代碼塊和同步方法可...

    zhaochunqi 評(píng)論0 收藏0
  • Java并發(fā)編程實(shí)戰(zhàn)」之對(duì)象的共享

    摘要:當(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)域用...

    phodal 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<