Java并发编程分享

上传人:da****ge 文档编号:243098239 上传时间:2024-09-15 格式:PPTX 页数:43 大小:982.44KB
返回 下载 相关 举报
Java并发编程分享_第1页
第1页 / 共43页
Java并发编程分享_第2页
第2页 / 共43页
Java并发编程分享_第3页
第3页 / 共43页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,#,高嵩,2013-05-02 V0.1,2013-12-12 V0.2,Java,并发编程分享,大纲,并发编程概述,JMM,(,Java Memory Model,)概述,可见性,有序性,并发工具,监控与跟踪,为什么要学习并发编程?,充分利用服务器资源,提高服务吞吐量、降低响应时间,爬虫、,WebServer,、日志分析,分布式系统,资源的争用、可伸缩性,多线程的优点,多线程的代价,设计更复杂,资源共享、数据一致性及可见性、调试困难,性能开销,锁、上下文切换,内存开销,贸然进行的性能优化,顺序,IO vs,随机,IO,的例子,问题,所有内存都是共享的吗?,栈上分配的变量是线程安全的,共享内存一定不是线程安全的吗?,不一定,正确的同步,or,不可变对象,or,线程级别的资源,锁的是谁?,试试回答这些,问题,还有一题:,大纲,并发编程概述,JMM,(,Java Memory Model,)概述,可见性,有序性,并发工具,监控与跟踪,JMM-,抽象模型,Sandy Bridge,内存模型,JMM-,线程间通讯,大纲,并发编程概述,JMM,(,Java Memory Model,)概述,可见性,有序性,并发工具,监控与跟踪,问题:可见性,?,写,boolean,型对其它线程马上可见吗?,VisibilityTest1.java,写引用对其它线程马上可见吗?,VisibilityTest2.java,12,安全发布对象,This,溢出的例子,VisibilityTest3.java,避免,this,溢出,VisibilityTest4.java,13,大纲,并发编程概述,JMM,(,Java Memory Model,)概述,可见性,有序性,并发工具,监控与跟踪,问题:有序性?,代码顺序,=,程序执行顺序 ?,单线程,没有数据依赖的话:允许重排序,多线程,整体无序:,i+,线程内重排序:下面的例子,线程间看到的顺序也不一致(可见性导致),理想情况是什么?,顺序一致性模型,JMM-,顺序一致性,理想情况:,正确同步,下的,真实情况,JMM-,重排序,例,1,:,ReorderTest1.java,JMM-,重排序,例,2,:,ReorderTest2.java/ReorderTest3.java,Write Thread:,写,-,写,Read Thread:,读,-,读,JMM-,重排序,写,-,写 重排序,JMM-,重排序,读,-,读 重排序,JMM-,重排序,不同处理器上的重排序规则,JMM-,重排序,难以测试的原因,测试环境和生产环境的,JVM,版本,/,硬件配置的不同,不同生产环境的,JVM,版本,/,硬件配置的不同,23,大纲,并发编程概述,JMM,(,Java Memory Model,)概述,可见性,有序性,并发工具,监控与跟踪,并发编程带来的问题,不能保证原子性,JMM,提供最低安全性,除了,long /double,不能保证可见性,各个,CPU,独享的工作内存,不能保证有序性,并发工具,不可变类,线程独享资源,synchronized,(代码块、实例方法、静态方法),volatile,(实例变量、静态变量),CAS,j.u.c,26,synchronized,锁的原理,任何对象都有一个,monitor,(监视器,/,管程)与之关联,当且一个,monitor,被持有后,它将处于锁定状态。,27,synchronized,synchronized,可以做到:,可重入、互斥性、,可见性,synchronized,不能做到:,等待超时、可中断、公平性,28,可见性如何保证?,JMM happens-before,规则,线程中上一个动作及之前的所有写操作在该线程执行下一个动作时对该线程可见,如果线程,1,解锁了,monitor a,,接着线程,2,锁定了,a,,那么,线程,1,解锁,a,之前的写操作都对线程,2,可见,happends-before,有传递性,如何应用,happens-before,29,volatile,volatile,可以做到:,原子性、可见性,volatile,不能做到:,复合操作的原子性:,TestVolatile.java,volatile,引用指向对象属性,/,数组元素的可见性,volatile,提供:,与锁一致的语义,并且比锁的开销小,可见性如何保证?,happened-before,规则:,如果线程,1,写入了,volatile,变量,v,,接着线程,2,读取了,v,,那么,线程,1,写入,v,及之前的写操作都对线程,2,可见,改造,VisibilityTest2.java/ReorderTest3.java,31,Compare And Swap,32,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,的缺点:,竞争激烈的情况下耗费,CPU,33,CAS,的使用场景,引用替换,AtomicReference,状态记录,AtomicBoolean,统计,AtomicInteger/AtomicIntegerArray,AtomicLong/ AtomicLongArray,34,java.util.concurrent,Lock,可重入锁:,ReentrantLock,等待超时、可中断、公平性,读写锁,ReentrantReadWriteLock,35,java.util.concurrent,ThreadPoolExecutor,poolSize,不要过大,BlockingQueue,不要过大,考虑拒绝策略,Callable,有返回值、可抛出异常的,Runnable,FutureTask,可取消的异步任务,安全的发布对象,36,java.util.concurrent,数据结构支持,HashMap - ConcurrentHashMap,SortedMap - ConcurrentSkipListMap,Set - CopyOnWriteArraySet,SortedSet - ConcurrentSkipListSet,Queue - BlockingQueue,List - CopyOnWriteArrayList,37,java.util.concurrent,Semaphore,CountDownLatch/CyclicBarrier,38,大纲,并发编程概述,JMM,(,Java Memory Model,)概述,可见性,有序性,并发工具,监控与跟踪,监控与跟踪,监控工具,jstack,、,jvisualvm,跟踪,NamedThreadFactory.java,ExceptionUtils.getStackTrace(new Throwable();,出问题先保留现场(,dump,堆、,jstack,、留,gc,日志等),再重启服务,40,Q & A,参考资料,Java,并发性和多线程介绍,深入理解,java,内存模型,同步和,Java,内存模型,happens-before,俗解,推荐网站:,并发编程网,推荐书籍:,Java,并发编程实践,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!