国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

安全發(fā)布對像

BLUE / 3025人閱讀

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

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

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

這將導致this逸出,所謂逸出,就是在不該發(fā)布的時候發(fā)布了一個引用。在這個例子里面,當我們實例化ThisEscape對象時,會調(diào)用source的registerListener方法,這時便啟動了一個線程,而且這個線程持有了ThisEscape對象(調(diào)用了對象的doSomething方法),但此時ThisEscape對象卻沒有實例化完成(還沒有返回一個引用),所以我們說,此時造成了一個this引用逸出,即還沒有完成的實例化ThisEscape對象的動作,卻已經(jīng)暴露了對象的引用。其他線程訪問還沒有構造好的對象,可能會造成意料不到的問題。

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 {
  }
}

在這個例子中我們使用匿名類的形式來構造,只有在整個對象都實例化好了才能會執(zhí)行。只有當構造函數(shù)返回時,this引用才應該從線程中逸出。構造函數(shù)可以將this引用保存到某個地方,只要其他線程不會在構造函數(shù)完成之前使用它

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74490.html

相關文章

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

    摘要:當某個不應該發(fā)布的對象被發(fā)布時,這種情況被稱為逸出。線程安全共享線程安全的對象在其內(nèi)部實現(xiàn)同步,因此多線程可以通過對象的公有接口來進行訪問而不需要進一步的同步。 前言   本系列博客是對《Java并發(fā)編程實戰(zhàn)》的一點總結,本篇主要講解以下幾個內(nèi)容,內(nèi)容會比較枯燥??赡艽蠹铱礃祟}不能能直觀的感受出到底什么意思,這就是專業(yè)術語,哈哈,解釋下,術語(terminology)是在特定學科領域用...

    phodal 評論0 收藏0
  • 聊聊GC

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

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

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

    89542767 評論0 收藏0
  • java并發(fā)編程學習12--并發(fā)數(shù)據(jù)結構簡介

    摘要:并發(fā)數(shù)據(jù)結構存在的理由串行數(shù)據(jù)結構在并發(fā)環(huán)境下是不安全的,而直接使用鎖又會帶來性能的影響,所以專門設計了針對并發(fā)環(huán)境下的數(shù)據(jù)結構,其中使用了無鎖運算來保證性能。在高并發(fā)的情況下過多的鎖操作會拖累系統(tǒng)的性能。是由數(shù)組結構和數(shù)組結構組成。 【并發(fā)數(shù)據(jù)結構存在的理由 串行數(shù)據(jù)結構在并發(fā)環(huán)境下是不安全的,而直接使用鎖又會帶來性能的影響,所以jdk專門設計了針對并發(fā)環(huán)境下的數(shù)據(jù)結構,其中使用了無...

    dreamGong 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<