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