亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

安全發(fā)布對像

BLUE / 3074人閱讀

摘要:發(fā)布對像定義是一個(gè)對象能夠被當(dāng)前范圍之外的代碼所使用對象溢出一種錯(cuò)誤的發(fā)布。構(gòu)造函數(shù)可以將引用保存到某個(gè)地方,只要其他線程不會(huì)在構(gòu)造函數(shù)完成之前使用它

發(fā)布對像
定義: 是一個(gè)對象能夠被當(dāng)前范圍之外的代碼所使用
對象溢出
一種錯(cuò)誤的發(fā)布。當(dāng)一個(gè)對象該沒有構(gòu)造完成時(shí),就使被其他線程所見。

下面我們來看一下沒有安全發(fā)布的對象

@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è)對象通過getStates方法我們可以獲取這個(gè)對象的數(shù)組,此時(shí)我們將數(shù)組內(nèi)容打印出來結(jié)果,如果此時(shí)我們將這個(gè)對象發(fā)布出去,然后其他線程(這里沒有模擬其他線程對其修改)又對這個(gè)對象的states的值進(jìn)行修改,此時(shí)在拿到這個(gè)對象的期望的是沒有被修改的,事實(shí)上得到的對象是修改過后的。也就是說我們不能直接通過一個(gè)public的一個(gè)set方法就行return。

下面我們再看一段對象溢出的代碼

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對象時(shí),會(huì)調(diào)用source的registerListener方法,這時(shí)便啟動(dòng)了一個(gè)線程,而且這個(gè)線程持有了ThisEscape對象(調(diào)用了對象的doSomething方法),但此時(shí)ThisEscape對象卻沒有實(shí)例化完成(還沒有返回一個(gè)引用),所以我們說,此時(shí)造成了一個(gè)this引用逸出,即還沒有完成的實(shí)例化ThisEscape對象的動(dòng)作,卻已經(jīng)暴露了對象的引用。其他線程訪問還沒有構(gòu)造好的對象,可能會(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è)例子中我們使用匿名類的形式來構(gòu)造,只有在整個(gè)對象都實(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/74490.html

相關(guān)文章

  • 「Java并發(fā)編程實(shí)戰(zhàn)」之對象的共享

    摘要:當(dāng)某個(gè)不應(yīng)該發(fā)布的對象被發(fā)布時(shí),這種情況被稱為逸出。線程安全共享線程安全的對象在其內(nèi)部實(shí)現(xiàn)同步,因此多線程可以通過對象的公有接口來進(jìn)行訪問而不需要進(jìn)一步的同步。 前言   本系列博客是對《Java并發(fā)編程實(shí)戰(zhàn)》的一點(diǎn)總結(jié),本篇主要講解以下幾個(gè)內(nèi)容,內(nèi)容會(huì)比較枯燥。可能大家看標(biāo)題不能能直觀的感受出到底什么意思,這就是專業(yè)術(shù)語,哈哈,解釋下,術(shù)語(terminology)是在特定學(xué)科領(lǐng)域用...

    phodal 評論0 收藏0
  • 聊聊GC

    摘要:復(fù)制這一工作所花費(fèi)的時(shí)間,在對象存活率達(dá)到一定程度時(shí),將會(huì)變的不可忽視。針對老年代老年代的特點(diǎn)是區(qū)域較大,對像存活率高。這種情況,存在大量存活率高的對像,復(fù)制算法明顯變得不合適。 GC(Garbage Collection)即Java垃圾回收機(jī)制,是Java與C++的主要區(qū)別之一,作為Java開發(fā)者,一般不需要專門編寫內(nèi)存回收和垃圾清理代碼,對內(nèi)存泄露和溢出的問題,也不需要像C++程序...

    developerworks 評論0 收藏0
  • python中Requests請求的安裝方法與常見用法詳解

      小編寫這篇文章的一個(gè)主要目的,主要是給大家去做一個(gè)科普,解釋關(guān)于python中的一些相關(guān)的用法實(shí)例,包括介紹了python Requests請求方法,還有一些具體用法的詳細(xì)解釋,具體內(nèi)容,下面小編給大家詳細(xì)的解答?! ∫弧equests  request的說法網(wǎng)上有很多,簡單來說就是就是python里的很強(qiáng)大的類庫,可以幫助你發(fā)很多的網(wǎng)絡(luò)請求,比如get,post,put,delete等等,...

    89542767 評論0 收藏0
  • java并發(fā)編程學(xué)習(xí)12--并發(fā)數(shù)據(jù)結(jié)構(gòu)簡介

    摘要:并發(fā)數(shù)據(jù)結(jié)構(gòu)存在的理由串行數(shù)據(jù)結(jié)構(gòu)在并發(fā)環(huán)境下是不安全的,而直接使用鎖又會(huì)帶來性能的影響,所以專門設(shè)計(jì)了針對并發(fā)環(huán)境下的數(shù)據(jù)結(jié)構(gòu),其中使用了無鎖運(yùn)算來保證性能。在高并發(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ì)帶來性能的影響,所以jdk專門設(shè)計(jì)了針對并發(fā)環(huán)境下的數(shù)據(jù)結(jié)構(gòu),其中使用了無...

    dreamGong 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<