18.1. - Freie Universität Berlin

Transcription

18.1. - Freie Universität Berlin
Guava: Eine Java Dialekt ohne Wetlaufsituation
N. Patzelt
Freie Universität Berlin
Proseminar: Nichtsequentielle Programmiersprachen, WS 2011/12
Gliederung
Einleitung
Guava die Sprache
Syntax
Klassenkategorien
Object
Monitor
Value
Beispiele
Beispiel
Beispiel
Beispiel
Beispiel
I: SharedHashtable
II: String Buffer
III: Router
IV: Route with Name
Quellen
,
FU Berlin, Guava: Ein Java Dialekt, Proseminar WS 11/12
2
Einleitung
É
Java sehr weit verbreitet
É
Nebenläufigkeit wird interessanter
É
Java nutzt Monitore
É
Guava optimiert nebenläufige Prozesse
É
"Projekt Ocelot"bei IBM
É
“Guava: A Dialect of Java without Data Races“
,
FU Berlin, Guava: Ein Java Dialekt, Proseminar WS 11/12
3
Guava Syntax
É
führt neue Schlagwörter ein und entfernt andere
+ Klassenkategorien Objekt(Voreinstellung), Value und Monitor
+ read(Voreinstellung) und update Synchronisationsanmerkung für
Methoden und Parameter
É
É
É
Java hat nur exklusive Sperren
Guava unterscheidet
read nicht exklusiv und update exklusiv
+ local und global Zugriffsbeschränkungen für Methoden und
Parameter
+ kept(Voreinstellung), lent und new Region und Besitzanmerkungen
für Parameter und Rückgabewert
o wait, notify, notifyAll (nur bei Monitor)
- synchronized entfällt weil von Klasse abhängig
,
FU Berlin, Guava: Ein Java Dialekt, Proseminar WS 11/12
4
Guava Klassenkategorien
É
É
Java unterscheidet in zwei Klassenkategorien
Referenzen Daten sind null oder Zeiger auf Exemplar
É
É
É
Guava unterscheidet in parallele Referenzen und
Referenzen welche gemeinsame Benutzung nicht zulassen
Nicht-Referenzen Daten von einfachen Typ (int, char, byte) ohne
Klassen, Methoden, Verbung o.ä.
É
Guava nicht-Referenzen werden um Klassen mit primitiven Typen erweiter
,
FU Berlin, Guava: Ein Java Dialekt, Proseminar WS 11/12
5
Guava Klassenkategorien
Abbildung: Klassenherarchie in Guava
FU Berlin, Guava: Ein Java Dialekt, Proseminar WS 11/12
,
6
Die Guava Klassenkategorien: Object
É
an Object aus Java angelehnt
É
nicht parallel auslesbar
É
wird von einem Monitor oder Value besessen
,
FU Berlin, Guava: Ein Java Dialekt, Proseminar WS 11/12
7
Monitor
É
können von mehreren Threads benutzt werden
É
auf Methoden kann nur sequenziell zugegriffen werden
Operationen immer ”synchronized“
É
É
É
É
höhere Performance und Einfachheit
Threads sind Unterklassen von Monitor
Object und Value gehören Monitor
É
zugriffe auf andere Instanzen müssen nicht synchronisiert werden
,
FU Berlin, Guava: Ein Java Dialekt, Proseminar WS 11/12
8
Value
É
verhält sich wie Primitivedatentypen in Java
É
Variable und kein Verweis
É
Kopie anstelle von alias
É
können zwischen Monitoren ausgetauscht werden
É
Werte ohne Initialisierung sind null
,
FU Berlin, Guava: Ein Java Dialekt, Proseminar WS 11/12
9
Beispiel I: SharedHashtable
1
public class SharedHashtable extends Monitor {
2
private final BucketList[] buckets =
new BucketList[SIZE];
3
4
5
private int hash(Mobile key) {
return key.hashCode() % bucket.lenth;
}
6
7
8
9
public Mobile get(Mobile key) {
return buckets[hash(key)].get(key);
}
10
11
12
13
public update void put(Mobile key, Mobile data) {
buckets[hash(key)].put(key);
}
14
15
16
17
}
É
Monitor → kann Monitor oder Value sein
É
read ist der Regelfalll (nicht angegeben)
É
Konstruktoren sind immer update
É
Methoden die status der Exemplare verändern müssen update sein
,
FU Berlin, Guava: Ein Java Dialekt, Proseminar WS 11/12
10
Beispiel I: SharedHashtable
1
class BucketList extends Value {
2
private Bucket head;
3
4
public Mobile get(Mobile key) {
for (Bucket b = head; b != null; b = b.next){
if (b.key.quals(key)){
return b.data;
}
}
return null;
}
5
6
7
8
9
10
11
12
13
public update void put(Mobile key, Mobile data) {
head = new Bucket(key, data, head);
}
14
15
16
17
}
É
,
FU Berlin, Guava: Ein Java Dialekt, Proseminar WS 11/12
11
Beispiel I: SharedHashtable
1
2
3
4
class Bucket {
public final Mobile key;
public final Mobile data;
public Bucket next;
5
public Bucket(Mobile k, Mobile d, Bucket b) {
key = k;
data = d;
next = b;
}
6
7
8
9
10
11
}
,
FU Berlin, Guava: Ein Java Dialekt, Proseminar WS 11/12
12
Beispiel II: String Buffer
É
Regionalparameter kept und lent
É
Objekte haben Besitzer (Buckets in BucketList, BucketList in
SharedHashTable)
É
Objekte können nicht parallel ausgelesen werden, aber
weitergegeben werden
É
müssen in der selben Region sein
É
kept haben selbe Region wie ”this“ (Default)
É
lent bei Parameter mit eigener region
É
„lent“ ist die Gewährleistung, dass es keine Referenz von (oder zu)
diesem (Fremd-) Objekt geben wird
É
ist als Object implementiert → nur ein Prozess
,
FU Berlin, Guava: Ein Java Dialekt, Proseminar WS 11/12
13
Beispiel II: String Buffer
1 public class StringBuffer {
2
protected char[] string = new char[16];
3
protected int size = 0;
4
5
public char getChar(int i) {return string[i];}
6
7
public void print(update LocalOutputStream s) {
8
s.print(string, size);
9
}
10
11
public update void append(char c) {
12
if (size == string.length) {
13
string2 = new char[size * 2];
14
for (int i = 0; i < size; i++)
15
string2[i] = string[i];
16
string = string2;
17
}
18
string[size++] = c;
19
}
20
21
public update void append(lent StringBuffer s) {
22
for (int i = 0; i < s.size; i++)
23
append(s.getChar(i));
24
}
25
26
public new StringBuffer duplicate() {
27
StringBuffer b = new Stringbuffer();
28
b.size = size;
29
b.string = new char[size];
30
for (int i = 0; i < size; i++)
31
b.string[i] = string[i];
32
return b;
33
}
34 }
,
FU Berlin, Guava: Ein Java Dialekt, Proseminar WS 11/12
14
Beispiel III: Router
1 public class Router extends Monitor {
2
private boolean switch;
3
private StringBuffer default = new StringBuffer("default");
4
5
public update void move(
6
update StringList input in R,
7
update StringList out1 in R,
8
update StringList out2 in R)
9
{
10
moveString(input.remove(), out1, out2);
11
}
12
13
public update void moveDefault(
14
update StringList out1 in R,
15
update StringList out2 in R)
16
{
17
moveString(default.duplicate(), out1, out2);
18
}
19
20
protected update void moveString(
21
update StringBuffer input in R,
22
update StringList out1 in R,
23
update StringList out2 in R)
24
{
25
updateSwitch(input);
26
(switch ? out1 : out2).append(input);
27
}
28
private update void updateSwitch(StringBuffer s) {
29
switch = ...
30
}
31
32
publice StringBuffer getDefault() {
33
return degfault.duplicate();
34
}
35 }
,
FU Berlin, Guava: Ein Java Dialekt, Proseminar WS 11/12
15
Beispiel IV: Route with Name
1 public class RouteWithName {
2
3
private static Router router;
4
private static final String before = ": [";
5
private static final String after = "]\n";
6
7
public static update setRouter(Router r) {
8
router = r;
9
}
10
11
public final String name;
12
13
public RouteWithName(String s) {
14
name = before + s + after;
15
}
16
17
public global StringBuffer getDefault() {
18
return router.getDefault();
19
}
20
21
public global update void doMove(
22
update StringList input,
23
update StringList out1,
24
update StringList out1)
25
{
26
input.append(new StringBuffer(name));
27
while (! input.empty()){
28
router.move(input, out1, out2);
29
}
30
}
31 }
,
FU Berlin, Guava: Ein Java Dialekt, Proseminar WS 11/12
16
Quellen
,
FU Berlin, Guava: Ein Java Dialekt, Proseminar WS 11/12
17

Similar documents