# Objektreferenzen in Java



## Zender (11. Dez 2008)

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


----------



## stev.glasow (11. Dez 2008)

ä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.


----------



## Ebenius (11. Dez 2008)

Zender hat gesagt.:
			
		

> ```
> 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


----------



## Zender (11. Dez 2008)

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.


----------



## Ebenius (11. Dez 2008)

'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 ...
	
	
	
	





```
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


----------



## Zender (11. Dez 2008)

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


----------



## stev.glasow (11. Dez 2008)

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


----------



## Zender (11. Dez 2008)

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?


----------



## stev.glasow (11. Dez 2008)

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


----------



## Zender (11. Dez 2008)

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...


----------



## Ebenius (12. Dez 2008)

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()
> ...



Grüße, Ebenius


----------

