[英]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();
if (myObjec != null)
=>一切正常,則對象不為null myObj.release(); myObj = null;
myObj.release(); myObj = null;
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.