4. public class Account {
private long balance;
public final int accountNo;
public Account(long balance, int accountNo){
this.balance = balance; this.accountNo = accountNo;
}
public void debit(long debitAmount) {
this.balance -= debitAmount;
}
public void credit(long creditAmount) {
this.balance += creditAmount;
}
public long getBalance() {
return this.balance;
}
}
5. public class Account {
private long balance;
public final int accountNo;
public Account(long balance, int accountNo){
this.balance = balance; this.accountNo = accountNo;
}
public synchronized void debit(long debitAmount) {
this.balance -= debitAmount;
}
public synchronized void credit(long creditAmount) {
this.balance += creditAmount;
}
public long getBalance() {
return this.balance;
}
}
6. public class Account {
private long balance;
public final int accountNo;
public Account(long balance, int accountNo){
this.balance = balance; this.accountNo = accountNo;
}
public synchronized void debit(long debitAmount) {
this.balance -= debitAmount;
}
public synchronized void credit(long creditAmount) {
this.balance += creditAmount;
}
public synchronized long getBalance() {
return this.balance;
}
}
7. public class Account {
private volatile long balance;
public final int accountNo;
public Account(long balance, int accountNo){
this.balance = balance; this.accountNo = accountNo;
}
public synchronized void debit(long debitAmount) {
this.balance -= debitAmount;
}
public synchronized void credit(long creditAmount) {
this.balance += creditAmount;
}
public synchronized long getBalance() {
return this.balance;
}
}
8. public void transfer(Account fromAccount, Account toAccount,
long amount) throws Exception {
if (fromAccount.getBalance() < amount) {
throw new Exception("Not enough money!");
}
fromAccount.debit(amount);
toAccount.credit(amount);
}
9. public void transfer(Account fromAccount, Account toAccount,
long amount) throws Exception {
synchronized (fromAccount) {
synchronized (toAccount) {
if (fromAccount.getBalance() < amount) {
throw new Exception("Not enough money!");
}
fromAccount.debit(amount);
toAccount.credit(amount);
}
}
}
16. Concurrency
dreier som om ĂĽ gjøre ďŹere oppgaver
omtrent samtidig
Parallelism
dreier seg om ĂĽ dele en oppgave i mange
deloppgaver som kan gjøres concurrent
53. Clojures ďŹlosoďŹ
Verdier
Immutable/uforanderlig, primitiv eller sammensatt
Identitet
En observert entitet som vi assosierer med en serie
relaterte tilstander (verdier) over tid
Tilstand
Verdien til en identitet i pĂĽ et gitt tidspunkt
54. Clojures ďŹlosoďŹ
Verdier
Immutable/uforanderlig, primitiv eller sammensatt
Identitet
En observert entitet som vi assosierer med en serie
relaterte tilstander (verdier) over tid
Tilstand
Verdien til en identitet i pĂĽ et gitt tidspunkt
Tid
Relativ før/etter endring av identitet
86. Oppsummering
⢠Skiller tilstand og identitet
⢠Ingen mutable tilstand
⢠Ingenting blokkerer
⢠Clojure hjelper langt pü vei med concurrency
87. Oppsummering
⢠Skiller tilstand og identitet
⢠Ingen mutable tilstand
⢠Ingenting blokkerer
⢠Clojure hjelper langt pü vei med concurrency
⢠Mindre âaccidental complexityâ
113. JSON
⢠JavaScript Object Notation
⢠http://www.json.org/
⢠It is easy for humans to read and write.
⢠It is easy for machines to parse and generate
124. Oppgave
⢠Eksempel pĂĽ twitter json i âtwitter-java-search-json.txtâ
⢠Skrive ut âtweet-textâ fra live twitter søk
⢠Skriv ut encodings benyttet i resultat av live twitter søk
⢠twitter-java-search-json.txt
⢠Finn antall unike encodings
⢠Skriv ut tweets fra âworld_ďŹnanceâ
⢠Skriv ut tweets som er replies
⢠APIâer
⢠https://github.com/dakrone/clj-http
⢠http://clojure.github.com/clojure-contrib/json-api.html
accountNo -> final. Det er helt uproblematisk at dette er et public felt, i hvert fall fra et concurrency perspektiv.\n\n+= og -= er syntaktisk sukker for 3 operasjoner, read-write-store.\n
+= og -= er syntaktisk sukker for 3 operasjoner, read-write-store.\n
+= og -= er syntaktisk sukker for 3 operasjoner, read-write-store.\n
+= og -= er syntaktisk sukker for 3 operasjoner, read-write-store.\n
\n
Forhindre samtidig oppdatering ved &#xE5; l&#xE5;se p&#xE5; objektene.\n\nDette ser vel og bra ut, men med litt uheldig timing vil \n
Har vi klart &#xE5; unng&#xE5; alle mulige feil fra denne koden?\n* Slik kode er sv&#xE6;rt vanskelig &#xE5; resonnere rundt, og selv eksperter har problemer. Jeg kan helt &#xE6;rlig si at jeg ikke vet om denne koden er korrekt.\n* Et felt som kan endre seg -> Gir seg selv at i en ekte applikasjon vil sitausjonen v&#xE6;re mye v&#xE6;rre.\n* Det som v&#xE6;rre er, er at slik kode er nesten umulig &#xE5; teste. Feilsituasjoner med tr&#xE5;der oppst&#xE5;r kun som f&#xF8;lge av uheldig timing.\n* Hva er s&#xE5; problemet her, hvorfor er dette s&#xE5; vanskelig. Jo, vi programmerer med eksplisitte l&#xE5;ser, noe som i praksis viser seg &#xE5; v&#xE6;re en sv&#xE6;rt d&#xE5;rlig abstraksjon.\n\nDet m&#xE5; finnes bedre alternativer\n
\n
\n
\n
Korrekthet og ytelse\nPresisere at det vi skal snakke om er Concurrency.\n
Startet mars i 2006.\nF&#xF8;rste versjon 4 May 2009\nFikk veldig mye oppmerksomhet.\n
Alle problemer har en inherent complexity. Dette er det som uansett m&#xE5; til for &#xE5; l&#xF8;se problemet.\n
F&#xF8;rst lisp i 1958 John McCarthy\nIkke objektorientert\nYtelse nesten som Java\n
\n
Cambridge polish notation\n
Cambridge polish notation\n
Cambridge polish notation\n
Cambridge polish notation\n
Cambridge polish notation\n
Cambridge polish notation\n
Cambridge polish notation\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
Med l&#xE5;semodell, vil programmet g&#xE5; tregere jo flere som oppfatter/perceives meg?\n
\n
\n
\n
Epokisk tidsmodell\n
\n
Gjenta egenskaper! N&#xE5;r brukes dette!\n
Gjenta egenskaper! N&#xE5;r brukes dette!\n
Gjenta egenskaper! N&#xE5;r brukes dette!\n
Gjenta egenskaper. N&#xE5;r brukes dette!\nActors vs agents:\nAc -> Sende tilstand til oppf&#xF8;rsel\nAg -> Sende oppf&#xF8;rsel til tilstand\nSynkron perception\n
Gjenta egenskaper. N&#xE5;r brukes dette!\nActors vs agents:\nAc -> Sende tilstand til oppf&#xF8;rsel\nAg -> Sende oppf&#xF8;rsel til tilstand\nSynkron perception\n
Gjenta egenskaper. N&#xE5;r brukes dette!\nActors vs agents:\nAc -> Sende tilstand til oppf&#xF8;rsel\nAg -> Sende oppf&#xF8;rsel til tilstand\nSynkron perception\n
Gjenta egenskaper, n&#xE5;r brukes dette\n
Gjenta egenskaper, n&#xE5;r brukes dette\n
Gjenta egenskaper, n&#xE5;r brukes dette\n
\n
\n
STM var en av hoved&#xE5;rsakene til at Clojure ble s&#xE5;pass fort kjent.\nAnalogi\n
Snakke om .Net prosjektet\n
Atomic - rollback ved transactions ellers vil det committe\nConsistent - constraints i database, set-validator\nIsolated - Snapshot MVCC\nMen... kan gi rollback.\nEget eksempel 10 000 retries.\nEksempel tungt oppdaterer en ref som f&#xE5; konkurrerer om. S&#xE5; gj&#xF8;r den en lett jobb som oppdaterer en ref som mange konkurrerer om.\n
Atomic - rollback ved transactions ellers vil det committe\nConsistent - constraints i database, set-validator\nIsolated - Snapshot MVCC\nMen... kan gi rollback.\nEget eksempel 10 000 retries.\nEksempel tungt oppdaterer en ref som f&#xE5; konkurrerer om. S&#xE5; gj&#xF8;r den en lett jobb som oppdaterer en ref som mange konkurrerer om.\n
Atomic - rollback ved transactions ellers vil det committe\nConsistent - constraints i database, set-validator\nIsolated - Snapshot MVCC\nMen... kan gi rollback.\nEget eksempel 10 000 retries.\nEksempel tungt oppdaterer en ref som f&#xE5; konkurrerer om. S&#xE5; gj&#xF8;r den en lett jobb som oppdaterer en ref som mange konkurrerer om.\n
\n
N&#xE5;r man tenker seg om -> fornuftig m&#xE5;te &#xE5; modellere tilstand p&#xE5;. Bonusen er jo da at dette fungerer veldig bra i en concurrent setting.\n
N&#xE5;r man tenker seg om -> fornuftig m&#xE5;te &#xE5; modellere tilstand p&#xE5;. Bonusen er jo da at dette fungerer veldig bra i en concurrent setting.\n
\n
\n
Repl, dere kan f&#xF8;lge med p&#xE5; eksemplene. Read. Eval. Print. Loop.\n
+Enten clj, eller IDE, eller+ lein repl\n
Grunnenheten i spr&#xE5;ket. Angir et uttrykk. \n
Reader? \n
Parantesene betyr at dette er uttryk som returnerer noe. \n
F&#xF8;rste symbolet blir kallt som en funksjon\n
Dette er parametere\n
Merket foran betyr at det skal leses som en liste og ikke eksekveres\n
\n
\n
Funksjon som parameter. \n
fn lager en funksjon,\narg er et argument, kunne brukt hva som helst som navn\narg + 5 = resultat\n
Mange paranteser. F&#xF8;rste parantes betyr: n&#xE5; skal vi kalle noe. Skal kalle det som kommer fra andre parantes. Det er en funksjon. \n
Symbolet &#x201C;five&#x201D; har en verdi, men kun innenfor parentesene til let\n
\n
Organisert med tester, hver test har en eller flere ting som skal fylles inn. Trenger bare endre p&#xE5;&#xA0;ting innenfor en &#x201C;deftest&#x201D;.\n
F&#xF8;rste kj&#xF8;rer alle testene (oppgavene), andre kj&#xF8;rer bare de f&#xF8;rste oppgavene. Disse skal resultere i masse feilmeldinger.\n
\n
\n
Eksempel p&#xE5;&#xA0;test, tester likhet mellom 1 og 1, true og true. \n