Comparing different concurrency models on the JVM
(www.slideshare.net)
IngramChen
積分 6
我的偶像 Mario Fusco 又發了新投影片。光第九張投影片內容就滿滿的 best practice:
- Don't call alien methods while holding a lock
- Threads Acquire multiple locks in a fixed, global order
- Use interruptible locks instead of intrinsic synchronization
- Avoid blocking using concurrent data structures and atomic variable when possible
- Use thread pools instead of creating threads directly
- Hold locks for the shortest possible amount of time
- 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 這些工具也是很有用 (前提是用對)
這份投影片資訊真多,得花個時間慢慢消化。