2017-06-25 2 views
0

Noch in der Phase des Lernens OOP Konzepte in Java. Im Nebenläufigkeit Beispiel in Orakel Tutorial here ((bitte ertragen mit mir und habe es kurz, es ist einfach)), producerconsumerexample Klasse löst die beiden Threads producer und consumer, die beide Daten über die Drop Objekt drop austauschen sollten. Und in diesem Objekt sollen sie gegenseitig auf sich warten lassen.Concurrency Grundlagen - Data-Sharing-Objekt

public class ProducerConsumerExample { 
    public static void main(String[] args) { 
     Drop drop = new Drop(); 
     (new Thread(new Producer(drop))).start(); 
     (new Thread(new Consumer(drop))).start(); 
    } 
} 

Was ich nicht verstehe, ist, dass das drop Objekt zu jedem Thread von der Klasse producerconsumerexample übergeben wird, das uns zwei neue lokale Drop Objekte gibt, auch drop, einen in jedem der beiden Fäden genannt. Dies ist meines Wissens nach darauf zurückzuführen, dass die Weitergabe in Java nach Wert und nicht nach Referenz erfolgt. Somit hat jeder Thread nun seine eigene Version des Drop Objekts, also wie kommt es, dass sie immer noch Daten über das gleiche ursprüngliche Drop Objekt teilen sollen, da jeder Thread seine eigene Version hat?!

Jemand bitte helfen, ich würde wirklich wirklich wirklich es zu schätzen wissen.

+0

https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value – Mat

+0

Objekte als Referenz übergeben werden. –

+0

@Alexei und nach Wert für Primitive? –

Antwort

0

wenn Sie diesen Beispiel sprechen und Drop Variable - es Objekt, in Java alle Objekte durch Verweis nicht als Wert übergeben. Produzent und Konsument arbeiten mit demselben Objekt. Für Primitive übergeben nach Wert

public class ProducerConsumerExample { 
    public static void main(String[] args) { 
     Drop drop = new Drop(); 
     (new Thread(new Producer(drop))).start(); 
     (new Thread(new Consumer(drop))).start(); 
    } 
} 
+0

Was ist mit Primitiven? Werden sie nach Wert weitergegeben? –

+0

https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value –

0

Es ist etwas anders. Wie Sie gesagt haben, wird Java als Wert übergeben und nicht als Verweis, aber wenn wir den Wert eines Objekts übergeben, übergeben wir den Verweis darauf.

Am Anfang kann es ein Missverständnis sein, weil sie entschieden haben, den Standort eines Objekts als "Referenz" zu bezeichnen.

So speichern Procoder und Verbraucher die gleiche Referenz, so dass sie an demselben Objekt arbeiten.

Zum Beispiel:

class Foo { 
    Bar x; 
    public Foo(Bar v) { this.x = v; } 
    public String getString() { return x.y; } 
} 
class Bar { 
    String y; 
    public Bar() {} 
} 
class Test { 
    public static void main(String[] args) { 
      Bar x1 = new Bar(); 
      x1.y = "Test1"; 
      Foo x2 = new Foo(x1); 

      /* the method getString() returns "Test1" */ 
      System.out.println(x2.getString()); 

      /* If I change x1.y, x2.getString() returns a different element */ 
      x1.y = "Test 2"; 
      System.out.println(x2.getString()); 

    } 
} 
+0

Danke. Informativ! –