簡體   English   中英

在Java中檢查對象是否為空

[英]Checking for an object being null in Java

我正在用Java編寫代碼,在其中創建對象並在兩個不同的線程中訪問它。 我的第一個thread1線程在運行時在此對象上調用一些公共方法。

final Thread thread1 = new Thread(){
    @Override
    public void run() {
        myObj.pubFunc1();
        myObj.puFunc2();
        myObj.pubFunc3();
    }
};

我有另一個線程thread2 ,它可能會釋放該對象並將其設置為null例如:

final Thread thread2 = new Thread(){
    @Override
    public void run() {
        myObj.release();
        myObj = null;
    }
};

我的問題是我是否應該像這樣在我的thread1每個語句周圍放置null檢查?

final Thread thread1 = new Thread(){
        @Override
        public void run() {
            if(myObj != null) {
                myObj.pubFunc1();
            }
            if(myObj != null) {
                myObj.pubFunc2();
            }
            if(myObj != null) {
                myObj.pubFunc3();
            }
        }
    };

還是只檢查所有語句就足夠了? 可能由此引起的基本問題是,在進行空檢查的對象周圍是否有鎖? 如何處理這種情況。 我應該使用哪種設計模式來處理這種情況。

注意 :我不希望這三個語句必須執行,甚至不希望這三個語句形成一個原子單元。 如果我要對其執行操作的對象不為null,我只想執行一項操作。

您提出的設計存在缺陷。 想象一下這個執行:

  • myObj = new MyObject();
  • 線程2: if (myObjec != null) =>一切正常,則對象不為null
  • 線程1: myObj.release(); myObj = null; myObj.release(); myObj = null;
  • 線程2: myObj.pubFunc1(); =>繁榮,NPE。

我認為您只有兩種選擇:

  • 您可以同步對myObj的訪問,以使if / pubFunc調用變為原子
  • 或者您保存了對象的本地副本-根據您的用例,這可能會接受或可能不會接受:

     public void run() { MyObject localObj = myObj; if (localObj != null { //NOTE: myObj may have been released localObj.pubFunc1(); localObj.puFunc2(); localObj.pubFunc3(); } } 

注意:我假設您已經知道可見性問題,並且myObj已正確發布/同步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM