S
schmitzi9000
Gast
Gegeben sei folgende Konstellation:
Nehmen wir mal an die Referenz auf eine Instanz der Klasse Foo wird in mehreren Threads gehalten. D.h. der Thread, der die Instanz von Foo erzeugt und den Thread startet kann ein anderer sein als derjenige, der shutDown callt.
Foo ist ja selbst ein Thread. Dadurch, dass isRunning volatile ist, wird sichergestellt, dass Foo sofort mitbekommt, wenn ein anderer Thread diese Variable modifiziert. Soweit so gut. Wie sieht es jedoch mit der Klasse Dummy aus? Diese kann ja nicht als volatile deklariert werden. Um sie threadsafe zu machen müsste man den Zugriff auf someDummy in Foo synchronizen (oder Dummy selbst threadsafe machen).
Wie sieht es aber mit der Sichtbarkeit aus, wenn man das nicht tut? Undefiniert? Gibt es außer synchronized einen anderen Weg, sicherzustellen, dass alle zugreifenden Threads die "most up to date" Version von someDummy sehen?
Auf den Hintergrund würde ich gern im nächsten Post eingehen, sonst kommen zu viele Fragen auf einmal. Danke im Voraus
Java:
public class Foo extends Thread{
private volatile boolean isRunning = true;
private Dummy someDummy = new Dummy();
@Override
public void run(){
while(isRunning){
someDummy.bar();
Thread.sleep(500L);
}
}
public void shutDown(){
isRunning = false;
someDummy.status();
}
}
public class Dummy{
private int someNumber = 0;
public void bar(){
someNumber++;
}
public void status(){
System.out.println(someNumber);
}
}
Nehmen wir mal an die Referenz auf eine Instanz der Klasse Foo wird in mehreren Threads gehalten. D.h. der Thread, der die Instanz von Foo erzeugt und den Thread startet kann ein anderer sein als derjenige, der shutDown callt.
Foo ist ja selbst ein Thread. Dadurch, dass isRunning volatile ist, wird sichergestellt, dass Foo sofort mitbekommt, wenn ein anderer Thread diese Variable modifiziert. Soweit so gut. Wie sieht es jedoch mit der Klasse Dummy aus? Diese kann ja nicht als volatile deklariert werden. Um sie threadsafe zu machen müsste man den Zugriff auf someDummy in Foo synchronizen (oder Dummy selbst threadsafe machen).
Wie sieht es aber mit der Sichtbarkeit aus, wenn man das nicht tut? Undefiniert? Gibt es außer synchronized einen anderen Weg, sicherzustellen, dass alle zugreifenden Threads die "most up to date" Version von someDummy sehen?
Auf den Hintergrund würde ich gern im nächsten Post eingehen, sonst kommen zu viele Fragen auf einmal. Danke im Voraus