Hallo zusammen,
heute hat mir ein Entwickler erzählt, dass der Umgang mit Referenzen in bezog auf Threads nicht sicher ist und zu Abstürzen der JVM führen kann. Habt Ihr schon einmal davon was gehört? Mir ist die Info nämlich völlig neu.
Um das Problem zu erläutern:
Ein gemeinsames Objekt (nenne ich mal sharedObject) hat eine Referenz auf ein Objekt (nenne ich mal commonObject), welches auch instanziert ist. Nun will ein Thread diese Referenz lesen (wir gehen mal davon aus, dass die Referenz public ist):
Der zweite Thread erzeugt ein neues Objekt und überschreibt die Referenz mit der Referenz auf dieses neue Objekt:
Da der dahinter liegende Pointer (auch wenn man in Java keinen direkten Zugriff darauf hat, sind die Referenzen ja trotzdem Pointer) aus mehreren Bytes bestehen kann, kann es sein, dass der erste Thread nur einen Teil davon liest während bereits der zweite Thread diesen überschreibt. Der Pointer - oder die Referenz - , die der erste Thread dann am Ende hat, zeigt auf keine zulässige / gültige Adresse. Und beim ersten Zugriff auf diese (bspw. obj.toString()) fliegt die JVM ab. Soweit die Theorie meines Kollegen. Er hat das ganze anscheinend auf javaspecialists.eu nachgelesen. Ich konnte aber keinen entsprechenden Artikel dort finden.
heute hat mir ein Entwickler erzählt, dass der Umgang mit Referenzen in bezog auf Threads nicht sicher ist und zu Abstürzen der JVM führen kann. Habt Ihr schon einmal davon was gehört? Mir ist die Info nämlich völlig neu.
Um das Problem zu erläutern:
Ein gemeinsames Objekt (nenne ich mal sharedObject) hat eine Referenz auf ein Objekt (nenne ich mal commonObject), welches auch instanziert ist. Nun will ein Thread diese Referenz lesen (wir gehen mal davon aus, dass die Referenz public ist):
Java:
Object obj;
obj = sharedObject.commonObject;
Java:
Object obj;
obj = new Object();
sharedObject = obj;