Ich habe die Klasse Thread um ein Attribut und passende setter/getter erweitert. So soll es möglich sein, dass der Thread etwas in seiner Run() Methode abspeichert und ein Ergebnis darin ablegt. Vereinfacht sieht die Klasse so aus:
class MyThread
{
private Object result;
void run()
{
…
result = …
}
public synchronized void setResult(Object o)
{
result = o;
}
public Object getResult()
{
return result;
}
}
Wie man sehen kann habe ich den getter bewusst nicht synchronisiert. Mein Gedanke dahinter ist: Bei reinen lesen kann der Zustand von result nicht verändert werden, beim Schreiben durch den setter verhindert das Synchronized Statement parallele Zugriffe.
Aber plötzlich kommen mir Zweifel, ob es wirklich sicher läuft:
- Wenn ein Objekt auf den getter zugreift und die Variable versucht zu verändern, währenddessen aber der Thread selbst result verändern möchte, dann knallt es (?!)
- Wenn ich den getter synchronisiere, ändert es doch auch nichts, weil der Monitor nur über die Laufzeit der getter-Methode läuft (?!)
Wie macht man es also richtig?