Mir wurde diese etwas obskure, aber interessante Frage über das Verhalten von Java gestellt. Irgendwelche Ideen?
Antworten
Zu viele Anzeigen?Ja, für float
o double
NaN
s (aber nicht Float
o Double
). Abschnitt 4.2.3 der JLS 3rd Ed. Ich glaube, IEEE 754 definiert den Vorgang auf diese Weise. Das sind die einzigen Fälle.
Wie giddy schon sagte, kann die Gleichzeitigkeit alles durcheinander bringen. Ich habe gerade dies versucht:
public class Madness {
private static volatile long a = 0;
public static void main(String[] args) {
long good = 0;
long bad = 0;
new Thread() {
{
setDaemon(true);
}
public void run() {
while (true)
a++;
}
}.start();
long print = System.currentTimeMillis() + 1000;
while (true) {
if (a == a)
good++;
else
bad++;
if (System.currentTimeMillis() > print) {
System.out.println(String.format("%d / %d", good, bad));
print = System.currentTimeMillis() + 1000;
}
}
}
}
Die Ausgabe war:
19936409 / 382
38360780 / 640
56895813 / 898
75827635 / 1159
94500958 / 1423
113184503 / 1701
131711068 / 1960
150423573 / 2239
168898106 / 2509
Allerdings handelt es sich hier um einen Fall, der speziell für diesen Zweck konzipiert wurde. Das Entfernen der flüchtigen auf a
verändert die Dinge. Ich sehe einige anfängliche "schlechte" Treffer, aber dann scheint alles gut zu sein. Ich habe nicht nachgeforscht, aber ich habe das Gefühl, dass es etwas mit der Hot-Spot-Optimierung des Codes nach einer gewissen Anzahl von Iterationen zu tun hat.