Your SlideShare is downloading. ×
Java多线程常见陷阱
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Java多线程常见陷阱

6,379
views

Published on

杭州交流的PPT

杭州交流的PPT

Published in: Technology

1 Comment
21 Likes
Statistics
Notes
  • 谢谢分享啊!我发现淘宝的人很喜欢这个网站啊,呵呵
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
6,379
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
253
Comments
1
Likes
21
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Java并发编程的常见陷阱
    boyan@taobao.com(伯岩)
  • 2. 不要把并发当成万能锤子
    • 多线程 != 性能提升
  • Amdahl定律
    • 。如果F是必须串行化执行的比重,那么Amdahl定律告诉我们,在一个N处理器的机器中
    • 3. ,我们最多可以加速:
  • 正确使用读写锁
    • 读时不能写
    • 4. 写时不能读
    • 5. 可以并发读
    • 6. 不能并发写
    • 7. 读写比例高
  • 典型错误——LRUMap简单实现
    • 继承LinkedHashMap,enableLRU设置为true,覆写removeEldestEntry方法,
    • 8. 使用读写锁同步
    • 9. 读时不能写√
    • 10. 写时不能读√
    • 11. 可以并发读Ⅹ
    • 12. 不能并发写 √
    • 13. 读写比例高 √
  • 在构造函数中启动线程
    • 继承带来的隐患
  • 问题
    • 假设A的构造函数中启动某个线程,该线程读取A中的实例变量i
    • 14. B继承A,并在构造函数中重新给i赋值
    • 15. 问题: B的实例初始化,首先初始化父类A,启动线程,线程此时读取的i非B所期望。
    • 16. 解决:
    • 17. 1、不允许继承——final
    • 18. 2、单独的start方法(推荐)
  • 正确使用wait/notify
    • 一个世界在等待
  • 常见问题
    • 代码:
    • 19. 问题:
    • 20. 未同步
    • 21. If替代while——虚假唤醒
    • 22. notify替代notifyAll——被遗忘的线程
  • Atomic+Atomic!=Atomic
    • MethodA is thread-safe
    • 23. MethodBis thread-safe
    • 24. 组合起来还是线程安全的吗?
    • 25. public void methodC(){
    • 26. MethodA();
    • 27. MethodB();
    • 28. }
  • 我要同步
    • 容器是同步的,就没有问题了吗?
    • 29. 同步的不是容器,而是寂寞
  • 正确处理中断
    • 将中断进行到底
  • Thread.interrupt()干什么了?
    • 设置中断状态
    • 30. 中断阻塞操作
  • How
    • wait,sleep,join都是nativemthod,直接抛出InterruptedException
    • 31. InterruptibleChannel,关闭连接,
    • 32. 抛出ClosedByInterruptException(AbstractInterruptibleChannel.java):
  • 错误案例1
    • 取消任务,取消不了?
  • 错误案例2
    • 吞掉中断,上层代码怎么办?
  • 错误案例3
    • 包装成Runtime异常?
  • 取消任务的正确做法
    • 没有阻塞操作, volatile状态变量
    • 33. 不响应中断的阻塞操作,如socket.read()之类,关闭socket。
    • 34. 响应中断的阻塞操作(如sleep,wait,join等),推荐状态变量+捕捉中断异常
  • 处理InterruptedException
    • 除非你明确知道你在干什么,否则不要简单地catch并忽略
    • 35. 声明Check异常,继续抛出,交给他人处理
    • 36. 重设中断状态,让上层代码发现中断状态。
  • 嫁错郎,加错锁
    • 女怕嫁错郎
  • Don't
    • #1: Don’t synchronize on an object you’re changing
    • 37. #2: Don’t synchronize on a String literal
    • 38. #3: Don’t synchronize on auto-boxed values
    • 39. #4: Don’t synchronize on null
    • 40. #5: Don’t synchronize on a Lock object
    • 41. #6: Don’t synchronize on getClass()
    • 42. #7: Be careful locking on a thread-safe object with
    • 43. encapsulated locking
  • 错误案例1
    • 只把杭州当汴州
    • 44. 问题:
    • 45. foo是null?
    • 46. 改变了foo指向的对象,加锁形同虚设
  • 错误案例2
    • 躲猫猫
    • 47. 问题:
    • 48. Bar跟Foo的test方法中的锁不一样。
  • 错误案例3
    • 对同步的容器加锁,使用的锁与容器内部使用的锁不一定是同一个。
    • 49. HashTable、Vector√
    • 50. ConcurrentHashMap X
  • 不一致的同步
    • int的读写,问题不是太大
  • 邂逅Map
    • 忘记我的另一半,不可原谅
  • 阿甘,先别run
    • 美国犀利哥
  • Start Vs. Run
    • 哥只是爱跑步
    • 51. 问题:
    • 52. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4533087
    • 53. 在jdk1.4.2以前,每个thread初始化都会加入ThreadGroup,如果你只是调用run而不是
    • 54. start,那么此thread将无法被正常回收造成内存泄漏。在JDK5之后,将加入ThreadGroup
    • 55. 这一步从构造函数转移到start方法,因此不会有问题。
  • 正确使用Volatile
    • Volatile能做什么?
    • 56. 状态标识,如取消任务线程
    • 57. 安全发布,如修复DLC问题
    • 58. 开销较低的读写锁
  • 正确使用Volatile
    • Volatile不能做什么?
    • 59. 不能用于做计数器
    • 60. 与其他变量构成不变式
  • 规避j.u.c的bug
    • LinkedBlockingQueue.poll(time,timeUnit) 内存泄漏,其他queue也有类似问题
    • 61. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6460501
    • 62. Semaphore.tryAcquire内存泄漏甚至hang住
    • 63. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6460501
    • 64. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6241823
    • 65. ReentrantReadWriteLock可能在没有任何线程持有锁的情况下被hang住,这是
    • 66. 一系列的BUG:
    • 67. http://bugs.sun.com/view_bug.do?bug_id=6822370
    • 68. http://bugs.sun.com/view_bug.do?bug_id=6903249
    • 69. 可以说j.u.c在1.5这个版本上有非常多的bug,具体可以查看下sun的bug database
    • 70. ,推荐升级jdk到最新稳定版。
  • End,Thanks

×