Java并发编程分享

上传人:宝路 文档编号:46800554 上传时间:2018-06-28 格式:PPTX 页数:43 大小:983.86KB
返回 下载 相关 举报
Java并发编程分享_第1页
第1页 / 共43页
Java并发编程分享_第2页
第2页 / 共43页
Java并发编程分享_第3页
第3页 / 共43页
Java并发编程分享_第4页
第4页 / 共43页
Java并发编程分享_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《Java并发编程分享》由会员分享,可在线阅读,更多相关《Java并发编程分享(43页珍藏版)》请在金锄头文库上搜索。

1、高嵩2013-05-02 V0.12013-12-12 V0.2Java并发编程分享大纲1. 并发编程概述 2. JMM(Java Memory Model)概述3. 可见性 4. 有序性 5. 并发工具 6. 监控与跟踪为什么要学习并发编程? 充分利用服务器资源 提高服务吞吐量、降低响应时间 爬虫、WebServer、日志分析 分布式系统 资源的争用、可伸缩性多线程的优点多线程的代价 设计 更复杂 资源共享、数据一致性及可见性、调试困难 性能开销 锁、上下文切换 内存开销 贸然进行的性能优化 顺序IO vs 随机IO的例子问题 所有内存都是共享的吗? 栈上分配的变量是线程安全的 共享内存一定

2、不是线程安全的吗? 不一定,正确的同步 or 不可变对 象 or 线程级别的资源 锁的是谁? 试试回答这些问题 还有一题:大纲 并发编程概述 2. JMM(Java Memory Model)概述3. 可见性 4. 有序性 5. 并发工具 6. 监控与跟踪JMM-抽象模型Sandy Bridge内存模型JMM-线程间通讯大纲 并发编程概述 JMM(Java Memory Model)概述3. 可见性 4. 有序性 5. 并发工具 6. 监控与跟踪问题:可见性? 写boolean型对其它线程马上可见吗 ? VisibilityTest1.java 写引用对其它线程马上可见吗 ? Visibili

3、tyTest2.java12安全发布对象 This溢出的例子 VisibilityTest3.java 避免this溢出 VisibilityTest4.java13大纲 并发编程概述 JMM(Java Memory Model)概述 可见性 4. 有序性 5. 并发工具 6. 监控与跟踪问题:有序性? 代码顺序 = 程序执行顺序 ? 单线程 没有数据依赖的话:允许重排序 多线程 整体无序:i+ 线程内重排序:下面的例子 线程间看到的顺序也不一致(可见性导致) 理想情况是什么? 顺序一致性模型JMM-顺序一致性 理想情况:正确同步下的真实情况JMM-重排序 例1:ReorderTest1.ja

4、vaJMM-重排序 例2:ReorderTest2.java/ReorderTest3.java Write Thread: 写-写 Read Thread: 读-读JMM-重排序 写-写 重排序JMM-重排序 读-读 重排序JMM-重排序 不同处理器上的重排序规则JMM-重排序 难以测试 的原因 测试环 境和生产环境的JVM版本/硬件配置的不 同 不同生产环境的JVM版本/硬件配置的不同23大纲 并发编程概述 JMM(Java Memory Model)概述 可见性 有序性 5. 并发工具 6. 监控与跟踪并发编程带来的问题 不能保证原子性 JMM提供最低安全性,除了long /double

5、 不能保证可见性 各个CPU独享的工作内存 不能保证有序性并发工具 不可变类 线程独享资源 synchronized(代码块、实例方法、静态方法) volatile(实例变量、静态变量) CAS j.u.c26synchronized 锁的原理 任何对象都有一个 monitor (监视器/管程)与 之关联,当且一个monitor 被持有后,它将处于 锁定状态。27synchronized synchronized可以做到: 可重入、互斥性、可见性 synchronized不能做到: 等待超时、可中断、公平性28可见性如何保证? JMM happens-before规则 线程中上一个动作及之前的

6、所有写操作在该线 程执行下一个动作时对该线 程可见 如果线程1解锁了monitor a,接着线程2锁定了a ,那么,线程1解锁a之前的写操作都对线程2可 见 happends-before有传递性 如何应用happens-before29volatile volatile可以做到: 原子性、可见性 volatile不能做到: 复合操作的原子性:TestVolatile.java volatile引用指向对象属性/数组元素的可见性 volatile提供: 与锁一致的语义,并且比锁的开销小可见性如何保证? happened-before规则 : 如果线程1写入了volatile变量v,接着线程2读

7、取 了v,那么,线程1写入v及之前的写操作都对线 程2可见 改造VisibilityTest2.java/ReorderTest3.java31Compare And Swap32 AtomicInteger:public final int getAndAdd(int delta) for (;) int current = get();int next = current + delta;if (compareAndSet(current, next)return current;Compare And Swap CAS可以做到: 原子性、可见性 CAS的优点: 无锁的复合操作 CAS的缺

8、点: 竞争激烈的情况下耗费CPU33CAS的使用场景 引用替换 AtomicReference 状态记录 AtomicBoolean 统计 AtomicInteger/AtomicIntegerArray AtomicLong/ AtomicLongArray34java.util.concurrent Lock 可重入锁:ReentrantLock 等待超时、可中断、公平性 读写锁 ReentrantReadWriteLock35java.util.concurrent ThreadPoolExecutor poolSize不要过大 BlockingQueue不要过大,考虑拒绝策略 Call

9、able 有返回值、可抛出异常的Runnable FutureTask 可取消的异步任务,安全的发布对象36java.util.concurrent 数据结构支持 HashMap - ConcurrentHashMap SortedMap - ConcurrentSkipListMap Set - CopyOnWriteArraySet SortedSet - ConcurrentSkipListSet Queue - BlockingQueue List - CopyOnWriteArrayList 37java.util.concurrent Semaphore CountDownLatc

10、h/CyclicBarrier38大纲 并发编程概述 JMM(Java Memory Model)概述 可见性 有序性 并发工具 6. 监控与跟踪监控与跟踪 监控工具 jstack、jvisualvm 跟踪 NamedThreadFactory.java ExceptionUtils.getStackTrace(new Throwable(); 出问题先保留现场(dump堆、 jstack 、留gc日志等), 再重启服务40Q & A参考资料 Java并发发性和多线线程介绍绍 深入理解java内存模型 同步和Java内存模型 happens-before俗解 推荐网站:并发编发编 程网 推荐书书籍:Java并发编发编 程实实践

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号