• 1. 高嵩 2013-05-02 V0.1 2013-12-12 V0.2Java并发编程分享
  • 2. 大纲并发编程概述 JMM(Java Memory Model)概述 可见性 有序性 并发工具 监控与跟踪
  • 3. 为什么要学习并发编程?充分利用服务器资源 提高服务吞吐量、降低响应时间 爬虫、WebServer、日志分析…… 分布式系统 资源的争用、可伸缩性
  • 4. 多线程的优点
  • 5. 多线程的代价设计更复杂 资源共享、数据一致性及可见性、调试困难 性能开销 锁、上下文切换 内存开销 贸然进行的性能优化 顺序IO vs 随机IO的例子
  • 6. 问题所有内存都是共享的吗? 栈上分配的变量是线程安全的 共享内存一定不是线程安全的吗? 不一定,正确的同步 or 不可变对象 or 线程级别的资源 锁的是谁? 试试回答这些问题 还有一题:
  • 7. 大纲并发编程概述 JMM(Java Memory Model)概述 可见性 有序性 并发工具 监控与跟踪
  • 8. JMM-抽象模型
  • 9. Sandy Bridge内存模型
  • 10. JMM-线程间通讯
  • 11. 大纲并发编程概述 JMM(Java Memory Model)概述 可见性 有序性 并发工具 监控与跟踪
  • 12. 问题:可见性?写boolean型对其它线程马上可见吗? VisibilityTest1.java 写引用对其它线程马上可见吗? VisibilityTest2.java12
  • 13. 安全发布对象This溢出的例子 VisibilityTest3.java 避免this溢出 VisibilityTest4.java13
  • 14. 大纲并发编程概述 JMM(Java Memory Model)概述 可见性 有序性 并发工具 监控与跟踪
  • 15. 问题:有序性?代码顺序 = 程序执行顺序 ? 单线程 没有数据依赖的话:允许重排序 多线程 整体无序:i++ 线程内重排序:下面的例子 线程间看到的顺序也不一致(可见性导致) 理想情况是什么? 顺序一致性模型
  • 16. JMM-顺序一致性理想情况:
  • 17. 正确同步下的真实情况
  • 18. JMM-重排序例1:ReorderTest1.java
  • 19. JMM-重排序例2:ReorderTest2.java/ReorderTest3.java Write Thread: 写-写 Read Thread: 读-读
  • 20. JMM-重排序写-写 重排序
  • 21. JMM-重排序读-读 重排序
  • 22. JMM-重排序不同处理器上的重排序规则
  • 23. JMM-重排序难以测试的原因 测试环境和生产环境的JVM版本/硬件配置的不同 不同生产环境的JVM版本/硬件配置的不同23
  • 24. 大纲并发编程概述 JMM(Java Memory Model)概述 可见性 有序性 并发工具 监控与跟踪
  • 25. 并发编程带来的问题不能保证原子性 JMM提供最低安全性,除了long /double 不能保证可见性 各个CPU独享的工作内存 不能保证有序性
  • 26. 并发工具不可变类 线程独享资源 synchronized(代码块、实例方法、静态方法) volatile(实例变量、静态变量) CAS j.u.c26
  • 27. synchronized锁的原理 任何对象都有一个 monitor (监视器/管程)与之关联,当且一个monitor 被持有后,它将处于锁定状态。27
  • 28. synchronizedsynchronized可以做到: 可重入、互斥性、可见性 synchronized不能做到: 等待超时、可中断、公平性 28
  • 29. 可见性如何保证?JMM happens-before规则 线程中上一个动作及之前的所有写操作在该线程执行下一个动作时对该线程可见 如果线程1解锁了monitor a,接着线程2锁定了a,那么,线程1解锁a之前的写操作都对线程2可见 happends-before有传递性 如何应用happens-before 29
  • 30. volatilevolatile可以做到: 原子性、可见性 volatile不能做到: 复合操作的原子性:TestVolatile.java volatile引用指向对象属性/数组元素的可见性 volatile提供: 与锁一致的语义,并且比锁的开销小
  • 31. 可见性如何保证?happened-before规则: 如果线程1写入了volatile变量v,接着线程2读取了v,那么,线程1写入v及之前的写操作都对线程2可见 改造VisibilityTest2.java/ReorderTest3.java31
  • 32. Compare And Swap32AtomicInteger: public final int getAndAdd(int delta) { for (;;) { int current = get(); int next = current + delta; if (compareAndSet(current, next)) return current; } }
  • 33. Compare And SwapCAS可以做到: 原子性、可见性 CAS的优点: 无锁的复合操作 CAS的缺点: 竞争激烈的情况下耗费CPU33
  • 34. CAS的使用场景引用替换 AtomicReference 状态记录 AtomicBoolean 统计 AtomicInteger/AtomicIntegerArray AtomicLong/ AtomicLongArray34
  • 35. java.util.concurrentLock 可重入锁:ReentrantLock 等待超时、可中断、公平性 读写锁 ReentrantReadWriteLock35
  • 36. java.util.concurrentThreadPoolExecutor poolSize不要过大 BlockingQueue不要过大,考虑拒绝策略 Callable 有返回值、可抛出异常的Runnable FutureTask 可取消的异步任务,安全的发布对象36
  • 37. java.util.concurrent数据结构支持 HashMap -> ConcurrentHashMap SortedMap -> ConcurrentSkipListMap Set -> CopyOnWriteArraySet SortedSet -> ConcurrentSkipListSet Queue -> BlockingQueue List -> CopyOnWriteArrayList 37
  • 38. java.util.concurrentSemaphore CountDownLatch/CyclicBarrier38
  • 39. 大纲并发编程概述 JMM(Java Memory Model)概述 可见性 有序性 并发工具 监控与跟踪
  • 40. 监控与跟踪监控工具 jstack、jvisualvm…… 跟踪 NamedThreadFactory.java ExceptionUtils.getStackTrace(new Throwable()); 出问题先保留现场(dump堆、 jstack 、留gc日志等),再重启服务 40
  • 41. Q & A
  • 42. 参考资料Java并发性和多线程介绍 深入理解java内存模型 同步和Java内存模型 happens-before俗解 推荐网站:并发编程网 推荐书籍:《Java并发编程实践》
  • 43. (本页无文本内容)