Hi,
ich hab das mal im Buch "Killer Game Programming" gelesen und jetzt bin ich grad wieder in der JLS drübergestolpert. Bitte lest euch mal den kurzen Abschnitt über Thread#sleep/yield durch:
Threads and Locks
Bitte beachtet auch das Code-Bsp darunter!
Meine Frage ist jetzt: Ich hab noch nie nen volatile genutzt und hab oft die lifetime-booleans von thread-schleifen über einen anderen Thread auf false gesetzt - es hat aber immer funktioniert! War das nur Glück?
Außerdem: Was hat das jetzt eigentlich mit Thread#sleep/yield zu tun? Wenn ich statt der sleep-Anweisung in der while-Schleife zB nur ein sysout habe, hab ich dann das Problem nicht mehr dass der Thread evtl. ne veraltete Version der Variable aus dem Cache liest?
So wie sich das anhört muss man jeden primitive auf volatile setzen sobald mehr als 1 Thread den benutzen. Ich frag mich warum dass genau an dieser Stelle in der JLS erwähnt wird...
edit: Oder ist das irgendwie so ne theoretische "Halbwahrheit"? Mir fällt dazu grad auch das hier ein:
Ich glaub laut JLS sollte das auch immer auf dem EDT ausgeführt werden. In der Praxis ist es aber glaube ich noch nie einem Menschen gelungen dieses Programm auszuführen ohne dass ein Frame erscheint??!
Thx
ich hab das mal im Buch "Killer Game Programming" gelesen und jetzt bin ich grad wieder in der JLS drübergestolpert. Bitte lest euch mal den kurzen Abschnitt über Thread#sleep/yield durch:
Threads and Locks
Bitte beachtet auch das Code-Bsp darunter!
Meine Frage ist jetzt: Ich hab noch nie nen volatile genutzt und hab oft die lifetime-booleans von thread-schleifen über einen anderen Thread auf false gesetzt - es hat aber immer funktioniert! War das nur Glück?
Außerdem: Was hat das jetzt eigentlich mit Thread#sleep/yield zu tun? Wenn ich statt der sleep-Anweisung in der while-Schleife zB nur ein sysout habe, hab ich dann das Problem nicht mehr dass der Thread evtl. ne veraltete Version der Variable aus dem Cache liest?
So wie sich das anhört muss man jeden primitive auf volatile setzen sobald mehr als 1 Thread den benutzen. Ich frag mich warum dass genau an dieser Stelle in der JLS erwähnt wird...
edit: Oder ist das irgendwie so ne theoretische "Halbwahrheit"? Mir fällt dazu grad auch das hier ein:
Java:
public static void main(String[] x){
new JFrame().setVisible(true);
}
Ich glaub laut JLS sollte das auch immer auf dem EDT ausgeführt werden. In der Praxis ist es aber glaube ich noch nie einem Menschen gelungen dieses Programm auszuführen ohne dass ein Frame erscheint??!
Thx
Zuletzt bearbeitet: