Objektreferenzen in Java

Status
Nicht offen für weitere Antworten.

Zender

Mitglied
Hallo Leute,

ich habe zwei Threads innerhalb meines Programmes, dass das gleiche Objekt A nutzen soll. Ich möchte allerdings auf ein statische Methoden/Membervariablen verzichten. Dazu habe ich http://javadude.com/articles/passbyvalue.htm
angeschaut. Würde folgendes also klappen?

Ich instanziere dieses Objekt in meinem Hauptteil.
Object a = new Object();

Dann erstelle ich Thread1:
Thread1 t1 = new Thread1(a);
t1.run();

Und Thread2:
Thread2 t2 = new Thread2(a);
t2.run();

Wenn ich nun in Thread 1/2 Änderungen am Objekt vornehme, also bspw Membervariablen veränder, werden diese auch in dem anderen Thread übernommen, solange ich nicht das Objekt in einem der Threads neu erstelle, daher seine Speicheradresse innerhalb des Threads ändere. So habe ich o.g. Text verstanden.

Liege ich damit richtig?

Gruß, Zender
 
änderungen an den membervariablen innerhalb des objektes a haben haben damit nichts zu tun. pass by value heißt dass wenn du z.B: innerhalb des konstruktors Thread1() a = new Object() machst, dies keine auswirkung auf die referenz, die du Thread2 übergeben hast, hat. bei pass by reference würde der thread2 auch auf das neue object zugreifen - an dem c beispiel hier sieht man gut was da passiert.
 
Zender hat gesagt.:
Code:
Object a = new Object();
/* [...] */
Thread1 t1 = new Thread1(a);

Da stimmt einiges nicht. Zum Beispiel will Thread(Runnable) auch eine Runnable-Instanz haben. Und nicht nur einfach ein Object. Ansonsten schließe ich mich stevg an.

Willst Du eigentlich irgendwas bestimmtes machen? Vielleicht können wir Dir ja anders weiterhelfen...

Kleiner Hinweis: Code bitte als Source-Code formatieren.

Grüße, Ebenius
 
So ich muss wohl erstmal noch klarstellen, dass Thread1/2 einfach eigene Klassen sind die von "Thread" erben. Daher kann ich eigene Konstruktoren definieren, die angegebenen bekommen eben ein Objekt übergeben.


Wie genau haben "Membervariablen damit nichts zu tun"?
Was meinst du damit?
Werden Änderungen an den Membervariablen in beiden Objekten in Thread1/2 sichtbar?

Ich habe es jetzt so verstanden, dass im Prinzip beide Threads im Konstruktor eine Speicheradresse auf das Objekt übergeben bekommen. Von daher müssten doch Änderungen an dieser Speicherstelle (=dem Objekt) in beiden Threads sichtbar werden.


Was ich umsetzen möchte:
Ich will einfach die gleiche Objektinstanz in zwei verschiedenen Objektinstanzen (Threads) nutzen.
 
'Tschuldige die '1' und '2' hab ich im Klassennamen einfach überlesen. Ich schieb's mal darauf, dass nichts mit [code] formatiert war. Ist aber nur eine Ausrede. ;-)

Zender hat gesagt.:
Ich will einfach die gleiche Objektinstanz in zwei verschiedenen Objektinstanzen (Threads) nutzen.
Das erreichst Du damit, ja. Die Instanz ist die selbe. Was by-value meint, ist jedoch, dass der Zeiger als Wert übergeben wird, damit wäre eine neue Zuweisung im Konstruktur von Thread1 ...
Code:
Thread1(Object inst) {
  inst = null;
}
in Thread2 irrelevant. Würde per by-reference übergeben werden, dann würde sich inst für Thread2 verändern.

Hilft das? Ebenius
 
Jup, danke für deine Antwort, das ist soweit klar.

ABER was ist, wenn ich eben nicht die ganze Instanz im Konstruktor von Thread1 auf null setze, sondern nur eine Änderung an dem Objekt vornehme, sprich eine Anweisung ausführe, die etwas an den Membervariablen ändert.

Ist diese Membervariable dann auch im anderen Thread verändert?

Ansonsten:
Wie erreiche ich mein o.g. Ziel (1ne Objektinstanz in 2 versch. Objekten nutzen) in Java überlicherweise?

Gruß, Zender
 
jo werden mitverändert - ob das ganze nun im thread läuft oder nicht is eh schnuppe, dass hat damit nix zu tun. was du willst geht nur in dem du das erste objekt clonest (kein bock da jetzt was zu zu sagen, penn gleich weg hier) oder nen zweites objekt anlegest. anders wird das nix
 
stevg hat gesagt.:
jo werden mitverändert - ob das ganze nun im thread läuft oder nicht is eh schnuppe, dass hat damit nix zu tun. was du willst geht nur in dem du das erste objekt clonest (kein bock da jetzt was zu zu sagen, penn gleich weg hier) oder nen zweites objekt anlegest. anders wird das nix

Hm, wenn die Membervariablen mitverändert werden ist das doch gut und ich brauch nichts weiter?
Dann hab ich doch genau das gleiche Objekt in den beiden Instanzen?
 
achso ok dachte du brauchst für jeden tread separate membervariablen. ich hack den thread mal ab und guck was die madratze mir so zu sagen hat
 
stevg hat gesagt.:
achso ok dachte du brauchst für jeden tread separate membervariablen.

hm, ich habe gerade ein wenig überflogen, was man in Java unter "clonen" versteht. Aber da sieht es doch auch so aus, als ob die Membervariablen mitmodifiziert werden, oder nicht? Also dass die Clone untereinander abhängig sind...
 
Zender hat gesagt.:
hm, ich habe gerade ein wenig überflogen, was man in Java unter "clonen" versteht. Aber da sieht es doch auch so aus, als ob die Membervariablen mitmodifiziert werden, oder nicht? Also dass die Clone untereinander abhängig sind...

Normaler Weise nicht.
API-Doc. von Object.clone() hat gesagt.:
Creates and returns a copy of this object. The precise meaning of "copy" may depend on the class of the object. The general intent is that, for any object x, the expression:
x.clone() != x
will be true, and that the expression:
x.clone().getClass() == x.getClass()
will be true, but these are not absolute requirements. While it is typically the case that:
x.clone().equals(x)
will be true, this is not an absolute requirement.

By convention, the returned object should be obtained by calling super.clone. If a class and all of its superclasses (except Object) obey this convention, it will be the case that x.clone().getClass() == x.getClass().

By convention, the object returned by this method should be independent of this object (which is being cloned). To achieve this independence, it may be necessary to modify one or more fields of the object returned by super.clone before returning it. Typically, this means copying any mutable objects that comprise the internal "deep structure" of the object being cloned and replacing the references to these objects with references to the copies. If a class contains only primitive fields or references to immutable objects, then it is usually the case that no fields in the object returned by super.clone need to be modified.

The method clone for class Object performs a specific cloning operation. First, if the class of this object does not implement the interface Cloneable, then a CloneNotSupportedException is thrown. Note that all arrays are considered to implement the interface Cloneable. Otherwise, this method creates a new instance of the class of this object and initializes all its fields with exactly the contents of the corresponding fields of this object, as if by assignment; the contents of the fields are not themselves cloned. Thus, this method performs a "shallow copy" of this object, not a "deep copy" operation.

The class Object does not itself implement the interface Cloneable, so calling the clone method on an object whose class is Object will result in throwing an exception at run time.

Grüße, Ebenius
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben