2017-01-04 6 views
1

Ich schreibe meinen Code in Java, wo ich ein Objekt erstelle und in zwei verschiedenen Threads darauf zugreife. Mein erster Thread ruft zur Laufzeit einige öffentliche Methoden für dieses Objekt auf.Überprüfen, ob ein Objekt in Java null ist

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

Ich habe einen anderen Thread thread2, die diese Aufgabe lösen könnte, und setzen Sie ihn auf null wie:

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

Meine Frage ist, wenn ich in meinem thread1, wie dies für null um jede Aussage prüfen put sollte?

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

ODER nur ein Scheck um alle Aussagen ist genug? Die grundlegende Frage, die sich daraus ergeben könnte, ist eine Sperre um das Objekt herum, auf das wir einen Null-Check gemacht haben. Wie man mit dieser Situation umgeht. Welches Designmuster sollte ich verwenden, um mit dieser Situation umzugehen?

HINWEIS: Ich möchte nicht, dass die drei Anweisungen notwendigerweise ausgeführt werden, und ich will sogar nicht, dass die drei Anweisungen eine atomare Einheit bilden. Ich möchte nur eine Operation ausführen, wenn das Objekt, für das ich die Operation ausführe, nicht null ist.

+3

Wenn das Objekt asynchron null werden kann, müssen Sie dies überprüfen und es muss entweder "flüchtig" sein oder nur in "synchronisierten" Blöcken oder Methoden gelesen und geschrieben werden. Dies ist kein "Entwurfsmuster", es ist nur gesunder Menschenverstand, der sich aus der JLS ergibt. – EJP

Antwort

3

Das Design, das Sie vorschlagen, ist fehlerhaft. Stellen Sie sich diese Ausführung:

  • myObj = new MyObject();
  • Thread 2: if (myObjec != null) => alles gut, Objekt ist nicht null
  • Gewinde 1: myObj.release(); myObj = null;
  • Thread 2: myObj.pubFunc1(); => Boom, NPE.

Ich glaube, Sie haben nur 2 Möglichkeiten:

  • entweder Sie synchronisieren die Zugriffe auf myObj das zu machen, wenn/pubFunc Atom nennt
  • oder eine lokale Kopie des Objekts speichern - dies kann oder auch nicht akzeptabel sein, je nach Anwendungsfall:

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

Hinweis: Ich nehme an, dass Ihnen Sichtbarkeitsprobleme bekannt sind und dass myObj richtig veröffentlicht/synchronisiert ist.

+0

Ich verstehe die Bedeutung eines Objekts synchronisiert werden. Was genau meinst du mit "veröffentlicht". Ich nehme auch an, dass wenn Sie "Sichtbarkeitsprobleme" sagen, diese mit privaten, öffentlichen, geschützten und Paket-Ebenen in Verbindung stehen, richtig? – Swapnil

+0

@Swapnil nein ich meinte Sichtbarkeit über Threads. Zum Beispiel nehme ich an, dass entweder 'myObj' vollständig erstellt wird, bevor die Threads starten oder es flüchtig ist. Und ich habe auch angenommen, dass die verschiedenen Methoden (pubFunc1 etc.) Thread-sicher sind. – assylias

+0

Also, was ich bis jetzt verstehe, ist, dass Sie vorschlagen, die 'Null'-Prüfung und alle drei Funktionsaufrufe in einer synchronisiertenMy (Obj) zu haben (die auch von einem Null-Check umgeben sein müsste).Und wenn Sie sagen, dass die Methoden threadsicher sind, meinen Sie, dass sie ein Schlüsselwort 'synchron 'mit ihren Deklarationen haben, oder? – Swapnil

Verwandte Themen