12
Comparing different concurrency models on the JVM (www.slideshare.net)
IngramChen 積分 6

我的偶像 Mario Fusco 又發了新投影片。光第九張投影片內容就滿滿的 best practice:

  1. Don't call alien methods while holding a lock
  2. Threads Acquire multiple locks in a fixed, global order
  3. Use interruptible locks instead of intrinsic synchronization
  4. Avoid blocking using concurrent data structures and atomic variable when possible
  5. Use thread pools instead of creating threads directly
  6. Hold locks for the shortest possible amount of time
  7. Learn Java Concurrency API

第一點是最常見的亂源之一,很多時候你會設計個 Listener API 給外面用,但卻是在 synchonrzed 的 block 裡呼叫該 listener。這簡直是個未爆彈。一開始都沒事的,直到有人在 listener 的實作裡放了一個跑很久的 method,或是更慘 lock 到自己,變 dead lock。碰!程式就炸了!

第三點是我常用的技巧,如果在設計上真的無法排除 synchonized 的使用,我會換成 tryLock(3L, TimeUnit.SECONDS) ,強制這個 lock 最長只能等個幾秒。有了這個在正式線上時出錯時就不會 dead lock,被迫要整個 app 重開。這也可以安插 log,事後好追很多 (查 concurrent 的 bug 大部份都是瞎子摸象,有 log 差很多)

第四點 ConcurrentHashMap 和 LinkedBlockingQueue 是最常用的 Java concurrent data structures。我建議可以多花點時間了解,你的程式就可以少很多 synchronized lock (但無法全部)。當然還有 AtomicLong/AtomicReference/volatile 這些工具也是很有用 (前提是用對)

這份投影片資訊真多,得花個時間慢慢消化。

koji 積分 4

學到的教訓就是...能用更高階的 api 和模式解決(Task,Future,Actor...etc),就不要用 synchronized, lock 或繼承 Thread 這種方式,維護時修改好痛苦。

IngramChen 積分 0

盡可能囉。說真的要完全移掉 synchronized 不是很容易,要整個重新設計 。而且重新設計還需要腦袋轉個 180 度才行 (mental shift)。比方說從 lock 為基礎的構想改成 queue。

kaif 積分 2

我覺得一般應用,servlet container, spring之類的framework已經把concurrency大部分處理掉了,剩下就是一些小地雷,像是最近有踩到的在thread reuse時,threadLocal會髒掉之類的。

如果事要自己寫一個cassendra或是hadoop,那就傳統framework能做的就不多,此時使用actor model或許就划得來。

seathief 積分 0

第四張投影片,解釋concurrent/parallel programming真到位 XD

kaif 積分 0

其實不太能理解qq 還去查了一下

http://stackoverflow.com/questions/1050222/concurrency-vs-parallelism-what-is-the-difference

Blake 積分 0

第十和第十一張的比喻也很寫實XDDDDDDD