Klausur vom 29 07 2008 -- Lösung(update mit verbesserter Version)


ull: fehlt bei deiner 5c in der letztens zeile nicht noch der rekursive aufruf?


danke für die ausführlich erklärung.
das meiste davon war mir zwar schon klar :wink:
aber neu für mich ist die Info, dass sich durch das voletile in der Laufzeit das überschreiben von a und b nichtmehr vertauschen kann.
Steht das irgendwo im script? kanns nicht finden…
Dann ist das aber immer noch nicht konform mit dem was ull geschrieben hat…
@ Ull:
bei deinen voletile ergebnisen ist immer noch die möglichkeit dabei, dass t1 zuerst b=5 setzt und dann erst a=4.
Was bei dir jedoch wegfällt ist:
in den beiden Fällen, wo t1 nur a oder b überschreibt und t2 nur mit einen der beiden überschriebenen variablen “finished”,
nichtmehr die möglichkeit da ist, dass t2 diesen fall erstmal in “text” schriebt, aber dannach von t1 überhohlt wird und auch eine umgekehrt ausgabe folgt
=> zwei weitere Fälle => wieder 8 fälle und damit keine änderung…


ich haette gedacht das geht nicht, da C und D beschraenkt sind auf maximal eine Marke!

wenn nicht, dann haett ichauch die lebendigkeisfrage falsch. weil dann waer das netz ja ziemlich deadlock gefaehrdet
@cellus:

zu volatiles steht auch was im script, glaube script 3 oder 4 !
da steht auch dass die sogenannte „instruktionsumordnung“, die compiler betreiben, bei verwendung von volatiles „begrenzt“ wird.

zu ulls ergebnissen:
ich weiss nich wie er auf 8 kommt. ich habs mir auchnochmal angeguckt, aber ich kanns dennoch nich nachvollziehen.

vielleicht hab ich was falsch verstanden…::frowning:


btw

soweit ich informiert bin, ist system.out. atomar … oder liege ich da falsch?

zur 4d, Also ich komm auch auf 8 wenn man die Gesamtausgabe betrachtet:
2<1
4<5

4<5
5<4

2<4
4<5

5<1
4<5

und das ganze nochmal in umgekehrter reihenfolge:
4<5
2<1 … usw. => 8


fail…ich seh grad dass ich irgendwie im glauben war “stringzusammenstellung” und ausgabe waeren eine codezeile.
wtf wie ich drauf gekommen bin.

aber ja, klar, so wies da steht, gehts natuerlich in verschiedenen reihenfolgen!

son mist ey…


ist denn MIT volatail gesichert, dass die reihenfolge von a und b vom compiler nicht vertauscht wird?


naja…das skript ist da nicht soooo tief gehend.
es steht dort dass diese umordnung begrenzt wird.
als ich ma marc gefragt habe kam es so rueber als ob dann , wenn man volatiles verwendet ,die reihenfolge wohl bestehen bleibt, so wie sie im code drin steht.

vllt aeussern sich mal die JAVA Gurus dazu ?


hupsi ^^
da haste natürlich vollkommen recht g da hat jemand die einsen übersehen xD


Kann mir jemand posten wie ich Abstraktion und Applikation bei Aufgabe 6 a) schreiben muss? Man soll denke ich mal erkennen, dass

λ Wurst Salat.Hans Wurst == (λ Wurst.(λSalat.Hans Wurst))


hab bei 4e) 6

kann das jemand bestätigen?


Das hab ich auch:

4 < 5, 5 < 4
2 < 1, 4 < 5
2 < 4, 4 < 5

(und dann noch vertauscht: => 6)

Bei d) hab ich dann noch (inklusive Vertauschung), also insgesamt 8

5 < 1, 4 < 5

Aber da bin ich mir nicht ganz sicher - bei volatile haette ich jetzt zuerst gedacht, dass es nur die Sichtbarkeit sicherstellt.

Bei f) sollte auch 8 rauskommen, oder? Weil das sind ja unterschiedliche Objekte.

Bei a) hab ich 2,4,5, bei b) 1,4,5, bei c) 5 < 4, 2 < 1, 5 < 1.

Passt das so? Danke.


jo hab ich genauso


Hat jemand seine Lösung parat und kann sie posten?


Abstraktion
(λ Hans . (λ Wurst Salat . Hans Wurst) Kraut Wurst)
(λ Wurst Salat . Hans Wurst)
(λ Salat . Hans Wurst)

Applikation
(λ Wurst Salat . Hans Wurst) Kraut Wurst
(λ Wurst Salat . Hans Wurst) Kraut
Hans Wurst

bin mir aber nicht ganz sicher


Ja, das hab ich auch so.


Wieder Fragen zu den Wissensaufgaben in dieser Klausur:

b) Kann in einem parallel ausgeführten Java-Programm der Ausdruck n != n zu wahr ausgewertet werden, wenn n ein primitiver Datentyp (z. B. int) ist?

Nein, weil primitive Datentypen atomar ausgewertet werden?

e) Man kann die Laufzeit eines parallelen Programms im Allgemeinen verbessern, …
… wenn man kritische Abschnitte in 2 oder mehrere kritische Abschnitte zerschneidet. (Nein, da es an der Menge des sequenziell auszuführenden Codes nichts ändert.)
… wenn es gelingt, Klassen in Monitore umzuwandeln. (Nein. Eine Begründung habe ich nicht, außer dass ich davon in der Vorlesung nix gehört habe…)

Sind meine Anworten/Begründungen korrekt?


[quote=CR]b) Kann in einem parallel ausgeführten Java-Programm der Ausdruck n != n zu wahr ausgewertet werden, wenn n ein primitiver Datentyp (z. B. int) ist?

Nein, weil primitive Datentypen atomar ausgewertet werden?[/quote]

Folgendes Beispielprogramm:

public class Test { public static volatile int a = 0; public static void main(String[] args) { if (a != a) { System.out.println("x!"); } } }

Wird kompiliert zu:

[code=java]Compiled from “Test.java”
public class Test {
public static volatile int a;

public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object.“”:()V
4: return

public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field a:I
3: getstatic #2 // Field a:I
6: if_icmpeq 17
9: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
12: ldc #4 // String x!
14: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
17: return

static {};
Code:
0: iconst_0
1: putstatic #2 // Field a:I
4: return
}[/code]

Interessant sind jetzt die beiden [m]getstatic[/m]-Operationen in der main. Beide legen ihr Ergebnis für den Vergleich auf den Stack. Ist jetzt garantiert, dass beide den gleichen Wert zurückgeben?

(Den Bytecode bekommt man übrigens, wenn man javap -c auf die Klasse loslässt.)

1 „Gefällt mir“

Aufgabe 3d)
Gleich eine Frage hinterher: In der Aufgabe 3d) erstellen und starten wir eine gewisse Anzahl von Threads. Da die Threads jedoch “anonym” sind (mein t wird ja für jeden Thread neu referenziert) kann ich am Schluss nur einen einzigen Thread mit t.join() schließen - nämlich den zuletzt erzeugten. Warum funktioniert das Programm trotzdem? Ich dachte, wir müssen/sollten JEDEN erzeugten Thread explizit per join() schließen…?


@neverpanic: Ich hab diese Art von Code zwar noch nie gesehen, aber ich schließe daraus, dass das n sich zwischen den beiden “getstatic” ändern könnte. Ergo wäre ein True bei diesem Vergleich tatsächlich möglich. Korrekt? :slight_smile:


Das ist Java-Bytecode, d.h. das wozu dein Java-Code compiliert wird und das was dann tatsächlich von der Java-VM ausgeführt wird (naja, es ist eine lesbare Repräsentation davon, tatsächlich ist das natürlich alles binär). Es ist vergleichbar mit Assembler für x86, nur dass die Java-VM eine Stackmaschine ist. Siehe auch List of Java bytecode instructions - Wikipedia.

Ja.

1 „Gefällt mir“