Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Vaclav Pech on GPars
Search
Enterprise Java User Group Austria
March 05, 2012
Technology
0
39
Vaclav Pech on GPars
Enterprise Java User Group Austria
March 05, 2012
Tweet
Share
More Decks by Enterprise Java User Group Austria
See All by Enterprise Java User Group Austria
Gerrit Grunwald on What the CRaC... SUPERFAST JVM STARTUP
ejug
2
130
Spring Framework 5.2 - Core Container Revisited
ejug
0
150
Andreas Caternberg on Jenkins Pipelines
ejug
0
690
Martin Ahrer on Continuous Delivery Infrastructure With Docker
ejug
0
140
Dirk Mahler on Software Analyse mit jQAssistant & Neo4j
ejug
1
280
Christoph Strobl on Spring Data & Hypermedia
ejug
0
110
Stefan Armbruster on Graph Modelling Antipatterns
ejug
1
110
Stefan Armbruster on Introduction into Neo4J
ejug
1
84
Michael Nitschinger on Building a reactive Couchbase driver for the JVM
ejug
0
130
Other Decks in Technology
See All in Technology
自己的售票系統自己做!
eddie
0
460
技術広報のOKRで生み出す 開発組織への価値 〜 カンファレンス協賛を通して育む学びの文化 〜 / Creating Value for Development Organisations Through Technical Communications OKRs — Nurturing a Culture of Learning Through Conference Sponsorship —
pauli
5
280
ソフトウェア開発現代史: 55%が変化に備えていない現実 ─ AI支援型開発時代のReboot Japan #agilejapan
takabow
7
4.2k
Flutterにしてよかった?出前館アプリを2年運用して気づいたことを全部話します
demaecan
0
190
レビュー負債を解消する ― CodeRabbitが支えるAI駆動開発
moongift
PRO
0
390
マイクロリブート ~ACEマインドセットで実現するアジャイル~
sony
1
390
CloudFormationコンソールから、実際に作られたリソースを辿れるようになろう!
amixedcolor
1
190
Lazy Constant - finalフィールドの遅延初期化
skrb
0
210
AIエージェントによるエンタープライズ向けスライド検索!
shibuiwilliam
1
490
生成AIではじめるテスト駆動開発
puku0x
0
120
Flutterで実装する実践的な攻撃対策とセキュリティ向上
fujikinaga
2
420
機密情報の漏洩を防げ! Webフロントエンド開発で意識すべき漏洩パターンとその対策
mizdra
PRO
9
3.5k
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
246
12k
A Modern Web Designer's Workflow
chriscoyier
697
190k
YesSQL, Process and Tooling at Scale
rocio
174
15k
It's Worth the Effort
3n
187
28k
Done Done
chrislema
186
16k
Mobile First: as difficult as doing things right
swwweet
225
10k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.1k
The Cult of Friendly URLs
andyhume
79
6.7k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
RailsConf 2023
tenderlove
30
1.3k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
140
34k
Transcript
GPars Promises to keep Václav Pech
About me ['Passionate programmer', 'Concurrency enthusiast', 'GPars lead', 'Developer/technology evangelist
@ JetBrains' ].eachParallel {say it} http://www.jroller.com/vaclav http://twitter.com/vaclav_pech
We're all parallel now Use them or leave them!
None
# of cores
# of cores Today Soon
Dealing with threads sucks! public class Counter { private static
long count = 0; public Counter() { count++; } }
Dealing with threads sucks! public class Counter { private static
long count = 0; public Counter() { synchronized (this) { count++; } } }
Dealing with threads sucks! public class Counter { private static
long count = 0; public Counter() { synchronized (this.getClass()) { count++; } } }
Dealing with threads sucks! public class ClickCounter implements ActionListener {
public ClickCounter(JButton button) { button.addActionListener(this); } public void actionPerformed(final ActionEvent e) { ... } }
images.eachParallel {it.process()} documents.sumParallel() candidates.maxParallel {it.salary}.marry() Parallel Collections
Parallel Collections progLanguages.parallel.filter {it.concurrent} .max {it.javaInteroperability} .map {it.logo} ==
Fork/Join Solve hierarchical problems Divide and conquer
Merge sort, Quick sort Tree traversal File scan / search … [a, b, c, d, e, f, g, h] [a, b, c, d] [e, f, g, h] [a, b] [c, d] [e, f] [g, h]
Thread Pool Tasks Worker threads Queue
Thread Pool Contention!
Fork/Join Thread Pool
Fork/Join Thread Pool Work stealing
Languages are either concurrent or obsolete.
Java 5 Asynchronous calculations
Java 7 Asynchronous calculations Fork/Join
Java 8 Asynchronous calculations Fork/Join Parallel collections
Scala Asynchronous calculations Fork/Join Parallel collections Actors
Clojure Asynchronous calculations Fork/Join Parallel collections Actors Agents, Stm
Oz Asynchronous calculations Fork/Join Parallel collections Actors Agents, Stm Dataflow
Google's Go Asynchronous calculations Fork/Join Parallel collections Actors Agents, Stm
Dataflow CSP
Asynchronous calculations Fork/Join Parallel collections Actors Agents, Stm Dataflow CSP
Asynchronous calculations Fork/Join Parallel collections Actors Agents, Stm Dataflow CSP
Agenda
Actors Processes with a mail-box Share no data Communicate by
sending messages Use a thread-pool
Stateless Actors (pure Java) class MyActor extends DynamicDispatchActor { Account
account = ... public void onMessage(String msg) { String encripted = encrypt(msg); reply(encripted); } public void onMessage(Integer number) { reply(2 * number); } public void onMessage(Money cash) { System.out.println("Received a donation " + cash); account.deposit(cash); } }
Active Objects @ActiveObject class MyCounter { private int counter =
0 @ActiveMethod def incrementBy(int value) { println "Received an integer: $value" this.counter += value } }
Composing async functions int hash1 = hash(download('http://www.gpars.org')) int hash2 =
hash(loadFile('/gpars/website/index.html')) boolean result = compare(hash1, hash2) println result
Composing async functions @AsyncFun hash = oldHash @AsyncFun compare =
oldCompare @AsyncFun download = oldDownload @AsyncFun loadFile = oldLoadFile def hash1 = hash(download('http://www.gpars.org')) def hash2 = hash(loadFile('/gpars/website/index.html')) def result = compare(hash1, hash2) println result.get()
Composing async functions @AsyncFun hash = oldHash @AsyncFun(blocking = true)
compare = oldCompare @AsyncFun download = oldDownload @AsyncFun loadFile = oldLoadFile def hash1 = hash(download('http://www.gpars.org')) def hash2 = hash(loadFile('/gpars/website/index.html')) boolean result = compare(hash1, hash2) println result
int hash(String text) {…} Promise<int> hash(Promise<String> | String text)
int hash(String text) {…} Promise<int> hash(Promise<String> | String text) compare(
hash( download() ), hash( loadFile() ) )
int hash(String text) {…} Promise<int> hash(Promise<String> | String text) {
1.Return a Promise for the result 2.Wait (non-blocking) for the text param 3.Call the original hash() 4.Bind the result }
Composing async functions Combine functions as usual Parallelism is detected
automatically
Dataflow Concurrency No race-conditions No live-locks Deterministic
deadlocks Completely deterministic programs BEAUTIFUL code (Jonas Bonér)
Dataflow Variables / Promises main task2 task3 x y z
task1
Dataflows def df = new Dataflows() task { df.z =
df.x + df.y } task { df.x = 10 } task { println ”I am task 3” df.y = 5 } assert 15 == df.z
operator(inputs: [headers, bodies, footers], outputs: [articles, summaries]) {header, body, footer
-> def article = buildArticle(header, body, footer) bindOutput(0, article) bindOutput(1, buildSummary(article)) } * + <> Dataflow Operators
Url resolver Url resolver Downloader Groovy scanner Scala scanner Url
resolver Url resolver Reporter Speculator Evaluator Splitter Confirm Cache updates Approvals Dataflow Operators
None
'coz concurrency is Groovy Find more at: http://gpars.codehaus.org http://www.jroller.com/vaclav http://twitter.com/vaclav_pech
GPars