ImageVerifierCode 换一换
格式:PPT , 页数:86 ,大小:5.32MB ,
资源ID:11319743      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-11319743.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Java_并发编程培训.ppt)为本站会员(精品资料)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

Java_并发编程培训.ppt

1、Java 并发编程,龙浩,在一个list中有过亿条的Integer类型的值,如何更快的计算这些值的总和?,一个计算的问题,简单的方法:更快的CPU来遍历,靠谱的方法:分而治之来处理,进一步的方法:Fork/jion,简单的方法靠谱么?,免费午餐已经结束软件历史性地向并发靠拢 http:/ So:同样不是免费的午餐,需要学习和批量实践。,目录,线程,并发编程(juc),线程监控工具,编程思想和实践,Fork/Jion框架,Visibility:通过并发线程修改变量值, 必须将线程变量同步回主存后, 其他线程才能访问到。 Ordering:通过java提供的同步机制或volatile关键字, 来保

2、证内存的访问顺序。 Cache coherency :它是一种管理多处理器系统的高速缓存区结构,其可以保证数据在高速缓存区到内存的传输中不会丢失或重复。 Happens-before ordering:synchronized,volatile,final,java.util.concurrent.lock|atomic,线程:先让路给内存模型,这里有详述:http:/is.gd/c8fhE (别迷恋哥,哥只是传说!),内存中的可见部分,线程:synchronized,保证原子性和可见性,线程:Java Monitors,This figure shows the monitor as thr

3、ee rectangles. In the center, a large rectangle contains a single thread, the monitors owner. On the left, a small rectangle contains the entry set. On the right, another small rectangle contains the wait set. Active threads are shown as dark gray circles. Suspended threads are shown as light gray c

4、ircles.,线程:独占锁(synchronized),非方法修饰符,注意方法覆写的时候需要加上synchronized; 经典的顺序锁问题(两个线程安全的方法放在一起线程安全么? ) getClass的问题。 ,分拆前:思考问题,顺便教你一招!,分拆不了人,工具还不能分拆么?对,买3个手机去,线程:分拆锁,线程:分离锁,分离锁负面作用:对容器加锁,进行独占访问更加困难,并且更加昂贵了。 内存使用的问题:sina就曾经因为在Action层使用ConcurrentHashMap而导致内存使用过大,修改array后竟然单台服务器节省2G。,线程:static的案例,public class St

5、aticThreadTest /线程避免调用这个;public static Tree tree = new Tree(“jizi”,“2”); public static void createTree(Tree trees) Tree t = tree; if(trees.getName().equals(“pg“)t.setName(“ceshi“); public static void main(String args) throws InterruptedException ExecutorService exec = Executors.newFixedThreadPool(10

6、); for(int i=0;i10;i+) exec.execute(new TreeThread(i); Thread.sleep(50); exec.shutdown(); exec.awaitTermination(1, TimeUnit.SECONDS); ,线程:可见性,volatile关键字: 1:简化实现或者同步策略验证的时候来使用它; 2:确保引用对象的可见性; 3:标示重要的生命周期的事件,例如:开始或者关闭。脆弱的volatile的使用条件: 1:写入变量不依赖变量的当前值,或者能够保证只有单一的线程修改变量的值; 2:变量不需要和其他变量共同参与不变约束; 3:访问变量

7、时不需要其他原因需要加锁。,private volatile boolean isInterrupted = false;,任务的取消和线程超时,线程中断,教父Joshua Bloch说线程:,对共享可变数据同步访问; 避免过多的同步; 永远不要在循环外面调用wait; 不要依赖于线程调度器; 线程安全的文档化; 避免使用线程组。,目录,线程,并发编程(juc),线程监控工具,编程思想和实践,Fork/Jion框架,开始并发编程了,行动之前,拜神先,Mr. concurrency ,当今世界上并发程序设计领域的先驱,著名学者。他是util.concurrent包的作者,JSR166规范的制定。

8、 图书著作Concurrent Programming in Java: Design Principles and Patterns。 其” A Scalable Elimination-based Exchange Channel”和”Scalable Synchronous Queues”两篇论文列为非阻塞同步算法的经典文章。 A fork/jion framework同样影响着java7。,Doug Lea,Amdahl定律,并发编程:三大定律(1),讨论的是加速比(speedup)的问题,Gustafson 定律,并发编程:三大定律(2),Gustafson假设随着处理器个数的增加,

9、并行与串行的计算总量也是可以增加的。Gustafson定律认为加速系数几乎跟处理器个数成正比,如果现实情况符合Gustafson定律的假设前提的话,那么软件的性能将可以随着处理个数的增加而增加。,Sun-Ni定律,并发编程:三大定律(3),充分利用存储空间等计算资源,尽量增大问题规模以产生更好/更精确的解。,总结不是API,是寂寞!,来个高清无码版,Executors Executor ExecutorService ScheduledExecutorService Callable Future ScheduledFuture Delayed CompletionService Thread

10、PoolExecutor ScheduledThreadPoolExecutor AbstractExecutorService Executors FutureTask ExecutorCompletionService Queues BlockingQueue ConcurrentLinkedQueue LinkedBlockingQueue ArrayBlockingQueue SynchronousQueue PriorityBlockingQueue DelayQueue,Concurrent Collections ConcurrentMap ConcurrentHashMap C

11、opyOnWriteArrayList,SetSynchronizers CountDownLatch Semaphore Exchanger CyclicBarrierTiming TimeUnit Locks Lock Condition ReadWriteLock AbstractQueuedSynchronizer LockSupport ReentrantLock ReentrantReadWriteLock Atomics AtomicType, AtomicTypeArray AtomicTypeFieldUpdater AtomicMarkable,StampableRefer

12、ence,ThreadPoolExecutor:自己动手,丰衣足食!,public static ExecutorService newFixedThreadPool(int nThreads) return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue();,1:线程池的大小最好是设定好,因为JDK的管理内存毕竟是有限的; 2:使用结束,需要关闭线程池; 3: Runtime.getRuntime().addShutdownHook(hook); 对不能正

13、常关闭的 线程做好相关的记录。,Executors:ExecutorService,严重注意:别设置线程池无限大小,入门版:CompletionService,生产者消费者模式的简要实现版本。,双剑合璧:Future+Callable,任务池: ScheduledExecutorService,计划任务执行相关的操作,使用java真幸福,选择多多!,阻塞队列:BlockingQueue,Kaopuability:插入(offer);移除(poll),BlockingQueue 的诸侯领地,ArrayBlockingQueue:一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元

14、素进行排序。 Delayed 元素的一个无界阻塞队列,只有在延迟期满时才能从中提取元素. LinkedBlockingDeque一个基于已链接节点的、任选范围的阻塞双端队列。 LinkedBlockingQueue一个基于已链接节点的、范围任意的 blocking queue。此队列按 FIFO(先进先出)排序元素 PriorityBlockingQueue一个无界阻塞队列,它使用与类 PriorityQueue 相同的顺序规则,并且提供了阻塞获取操作。 SynchronousQueue一种阻塞队列,其中每个插入操作必须等待另一个线程的对应移除操作 ,反之亦然。,BlockingDeque:双

15、端队列,并发集合:你值得拥有,ConcurrentHashMap:解放军38军,你那飘逸的同步,分离锁的设计,再hash算法以及游离于多个Segment的耍心跳的各种操作,都深深的吸引了我。,详细设计细节:http:/ public List array = new ArrayList(); public List list = new CopyOnWriteArrayList(array);,同步器:四大金刚,闭锁:CountDownLatch,等待启动信号,等待完成信号,继续,启动信号+完成信号的模式,N部分锁存器倒计数模式; 当线程必须用这种方法反复倒计数时,可改为使用 CyclicBa

16、rrier,典型应用:手动控制事务,从数据库读取多份数据做初始化;,关卡:CyclicBarrier,Barrier,A,B,C,A,B,C,Barrier,Barrier,A,B,C,A barrier: A barrier is a coordination mechanosm (an algorithm) that forces process which participate in a concurrent (or distributed) algorithm to wait until each one of them has reached a certain point in

17、its program. The collection of these coordination points is called the barrier. Once all the processes have reached the barrier, they are all permitted to continue past the barrier.,信号量:Semaphore,获取信号( acquire();),交换器:Exchanger,数据分解和数据流分解的一种技巧,可被视为 SynchronousQueue 的双向形式。 JDK5时支持2个线程之间交换数据,JDK6后支持多个

18、。,至今我没有用过,锁云:你的柔情我永远不懂,内部锁,互斥锁,分离锁,分拆锁,闭锁,独占锁,读写锁,顺序锁,互斥锁: ReentrantLock,Lock 更加灵活,性能更好 interface Lock void lock();void lockInterruptibly() throws InterruptedException;boolean tryLock();boolean tryLock(long timeout, TimeUnit unit)throws InterruptedException;void unlock();Condition newCondition(); 支持

19、多个Condition 可以不以代码块的方式上锁 可以使用tryLock,并指定等待上锁的超时时间 调试时可以看到内部的owner thread,方便排除死锁 RenntrantLock支持fair和unfair两种模式,互斥锁(公平与非公平)和内部锁性能对比图,结论:非公平互斥锁和内部锁性能在jdk6_17下性能基本一样。 测试机:酷睿2.66双核,2G内存,win7,读写锁: ReadWriteLock,ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。,Reentra

20、ntReadWriteLock,ReadLock,WriteLock,线程1,线程2,线程3,高深:AbstractQueuedSynchronizer,为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量、事件,等等)提供一个框架; 基于JDK底层来操控线程调度,LockSupport.park和LockSupport.unpark; 此类支持默认的独占 模式和共享 模式之一,或者二者都支持; 如果想玩玩它,请看CountDownLatch的源码。 当然,也可以去FutureTask这个类看看。,目录,线程,并发编程(juc),线程监控工具,编程思想和实践,Fork/Ji

21、on框架,Fork/Join Framework (1),Work Stealing,Fork/Join Framework,FJTask框架是Cilk用到的设计方案的变体,相关系统依赖于轻量级可执行任务。这些框架都是像操作系统映射线程到CPU一样来映射任务到线程,从而开发单纯,有规律,有约束力的fork/join程序来执行映射动作。 工作线程池是确定的,每个工作线程(Thread子类FJTaskRunner的一个实例)是处理队列中任务的标准线程。正常的,工作线程的数量和系统的CPU的数量是一致的。任何合乎情理的映射策略将把这些线程映射到不同的cpu。 所有的fork/join任务都是一个轻量

22、级可执行类的实例,不是一个线程实例。在java中,独立的可执行任务必须实现Runnable接口并定义一个run()方法。在FJTask框架中,这些任务是FJTask的子类而不是Thread的子类,它们都实现了Runnable接口 一个简单的控制和管理设施(这里讲的是FJTaskRunnerGroup)设置工作池,从一个正常的线程(例如java语言中的main()方法)调用启动执行提供的fork/join任务。,Doug Lea论文:http:/gee.cs.oswego.edu/dl/papers/fj.pdf,Fork/Join 的案例:求数组中的最大值,Fork/Join 运行测试结果,表

23、 1. 在不同系统上从 500k 个元素的数组中运行 select-max 的结果,fork-join 池中的线程数量与可用的硬件线程(内核数乘以每个内核中的线程数)相等,Fork/Join 有用的资源,表 1. 在不同系统上从 500k 个元素的数组中运行 select-max 的结果,jsr166: http:/gee.cs.oswego.edu/dl/concurrency-interest/index.htmlJava 理论与实践: 应用 fork-join 框架:Brian Goetz http:/ http:/ 7 中的 Fork/Join 模式 http:/ 下面DIY方式很多,

24、txt编辑器都是好东西,线程监控:Jconsole,线程监控:VisualVm本地,下载地址:https:/ JDK1.6之后自带了这个攻击,在java_home/bin下面; 喜新厌旧的GGDDJJMM去上述地址下载吧!,内存监控:VisualVm远程,Thread Dump Analyzer,https:/ and swap,原子化的读-该-写指令 处理竞争策略:单个线程胜出,其他线程失败,但不会挂起,基本思想:Atomic原子类,基于硬件CAS实现Atomic类 分四组:计量器、域更新器、数组、复合变量 更佳的volatile 目标1:实现复杂算术运算:incrementAndGet、g

25、etAndIncrement等 目标2:支持Java类型对象的CAS操作:compareAndSet,基本思想:非阻塞算法,一个线程的失败或挂起不影响其他线程 J.U.C的非阻塞算法依赖Atomic 算法里一般采用回退机制处理Atomic的CAS竞争 对死锁免疫的同步机制 目标:相对阻塞算法,减少线程切换开销、减少锁的竞争等。 也是Lock-free,即无锁编程,无锁栈算法:Treiber算法,改进版:http:/ S - q u e u e 算法是1 9 9 6 年由M a g e d . M .Michael and M. L. Scott提出的,是最为经典的并发FIFO队列上的算法,目前

26、很多对并发FIFO队列的研究都是基于这个算法来加以改进的。MS-queue算法的队列用一个单链表来实现,包含两个基本的操作,enquene()和dequene() ,新节点总是从队尾最后一个元素后面加入队列,节点元素总是从队头删除。包含两个指针,head和tail,head总是自相链表头部的节点,指向的这个节点被当作是哑节点或哨兵节点,它保存的值是多少并无意义;tail总是指向链表中的一个节点,不一定是队尾元素。每个节点包含两个数据域值信息,即存放的数值信息和指向下一个节点的指针。每个指针对象,除了包含一个指向节点的指针外,还包含一个时间戳,初试时时戳为零,每修改一次指针,时戳增加一,在64位

27、系统中,无需考虑时戳溢出的影响。,无锁队列算法:Optitmistic算法,Optimistic算法对于上面提到的MS-queue算法的改进就在于使用普通的store指令代替代价昂贵的CAS指令。Optimistic算法的高效性在于使用双向链表表示队列,并且入队和出队操作都只需要一次成功的CAS操作。该算法保证链表总是连接的,next指针总是一致的,当prev指针出现不一致时通过调用fixList方法能够恢复到一致性状态。同MS-queue算法一样,optimistic算法也用到了原子化的指令Compare-and-swap(CAS),CAS(a,p,n),原子化的将内存地址a中的值与p进行比

28、较,如果二者相等,就将n写入地址a中并返回true,否则返回false。由于optimistic算法使用了CAS指令,所以经典的ABA问题同样会出现,解决方案同MS-queue相同,即使用标签机制。,论文地址:http:/nedko.arnaudov.name/soft/L17_Fober.pdf,Atomic实现,public final int incrementAndGet() for (;) int current = get();int next = current + 1;if (compareAndSet(current, next)return next; public fin

29、al boolean compareAndSet(int expect, int update) return pareAndSwapInt(this, valueOffset, expect, update); 当 import sun.misc.Unsafe; 这个的时候,就因为各种问题(例如:专利)看不到源码了。,好东东:AtomicReference,Lock-free的数据结构就靠这个了,无论你喜欢与否,玩无锁编程,你都绕不开这个类。看amino框架的源码,你会发现这个妞无处不在。当然,还是AtomicInteger比较实用,多线程计数的时候,你会喜欢的。,编程实践:使用更优的锁,编

30、程实践:使用更优的锁,ReentrantLock比较内部锁在JDK的性能提升对比,编程实践:使用更优的锁,读写锁对比互斥锁ReentrantLock的性能,编程实践:缩小锁的范围,减少线程把持锁的时间 避免在临界区进行耗时计算 常见做法:缩小同步快 常见做法:把一个同步块分拆成多个 需要保证业务逻辑正确为前提,编程实践:避免热点域,热点域:每次操作,都需要访问修改的fields eg. ConcurrentHashMap的size计算问题,编程实践:使用不变和Thread Local 的数据,不变数据,即Immutable类型数据、在其生命周期中始终保持不变,可以安全地在每个线程中复制一份以便

31、快速读取。 ThreadLocal数据,只被线程本身使用,因此不存在不同线程之间的共享数据的问题。,编程实践:使用高并发容器,J.U.C的高效地线程安全的并发容器 Amino提供更多非阻塞的容器,编程实践:高速缓存计算结果,利用空间换时间 避免了重复计算相同的数据,编程实践:文档化对外接口的同步策略,如果一个类没有明确指明,就不要假设它是线程安全的,编程实践:安全发布,NotThreadSafe public class UnsafeLazyInitialization private static Resource resource;public static Resource getIns

32、tance() if (resource = null)resource = new Resource(); / unsafe publicationreturn resource; ThreadSafe public class SafeLazyInitialization private static Resource resource;public synchronized static Resource getInstance() if (resource = null)resource = new Resource();return resource; ,编程实践:安全发布,Thre

33、adSafe public class EagerInitialization private static Resource resource = new Resource();public static Resource getResource() return resource; ThreadSafe public class ResourceFactory private static class ResourceHolder public static Resource resource = new Resource();public static Resource getResou

34、rce() return ResourceHolder.resource ; ,编程实践:安全发布,NotThreadSafe public class DoubleCheckedLocking private static Resource resource;public static Resource getInstance() if (resource = null) synchronized (DoubleCheckedLocking.class) if (resource = null)resource = new Resource();return resource; ,编程实践:利用成熟的框架,J.U.C Aminohttp:/amino-(1)、Data Structures(论文:http:/ Patterns & functionsMasterWorker(类似ExecutorService)、WorkStealingScheduler,编程实践:利用成熟的框架,(3)、Parallel functionsGraphAlg、ParallelPrefix、ParallelScanner、QuickSorter(4)、Atomics and STMMultiCAS、LockFreeBSTree,书籍推荐:,Q&A,

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报