Java_并发编程培训

上传人:n**** 文档编号:50747060 上传时间:2018-08-10 格式:PPT 页数:86 大小:5.32MB
返回 下载 相关 举报
Java_并发编程培训_第1页
第1页 / 共86页
Java_并发编程培训_第2页
第2页 / 共86页
Java_并发编程培训_第3页
第3页 / 共86页
Java_并发编程培训_第4页
第4页 / 共86页
Java_并发编程培训_第5页
第5页 / 共86页
点击查看更多>>
资源描述

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

1、Java 并发编程龙浩在一个list中有过亿条的Integer类型的值,如何更快的计算这些值的总和?一个计算的问题简单的方法:更快的CPU来遍历靠谱的方法:分而治之来处理进一步的方法:Fork/jion简单的方法靠谱么?免费午餐已经结束软件历史性地向并发靠拢 http:/ for小学生了!靠谱的方法简单么?(分而治之)list1list2list3ConcurrencyThreadThreadThread那帮Java大神在他们书中说: 在对性能的追求很可能是并发bug唯一最大的来源! So: 同样不是免费的午餐,需要学习和批量实践。目录线程并发编程(juc)线程监控工具编程思想和实践Fork/

2、Jion框架Visibility:通过并发线程修改变量值, 必须将线程变量同步回主存后, 其他线程才能访问到。Ordering:通过java提供的同步机制或volatile关键字, 来保证内存的访问顺序。Cache coherency :它是一种管理多处理器系统的高速缓存区结构,其可以保证数据在高速缓存区到内存的传输中不会丢失或重复。 Happens-before ordering:synchronized,volatile,final,java.util.concurrent.lock|atomic线程:先让路给内存模型这里有详述:http:/is.gd/c8fhE (别迷恋哥,哥只是传说!

3、)内存中的可见部分Stack-1Stack-2Stack-3GlobalsHeap线程:synchronized内 部 锁分 离 锁分 拆 锁保证原子性和可见性线程:Java MonitorsThis figure shows the monitor as three 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, anoth

4、er small rectangle contains the wait set. Active threads are shown as dark gray circles. Suspended threads are shown as light gray circles. 线程:独占锁(synchronized)l非方法修饰符,注意方法覆写的时候需要加上synchronized; l经典的顺序锁问题(两个线程安全的方法放在一起线程安全么? ) lgetClass的问题。 l分拆前:思考问题,顺便教你一招!分拆不了人,工具还不能分拆么?对,买3个手机去线程:分拆锁线程:分离锁分离锁负面作用

5、:对容器加锁,进行独占访问更加困难,并且更加昂贵了 。 内存使用的问题:sina就曾经因为在Action层使用ConcurrentHashMap而 导致内存使用过大,修改array后竟然单台服务器节省2G。线程:static的案例public class StaticThreadTest /线程避免调用这个; public static Tree tree = new Tree(“jizi”,“2”); public static void createTree(Tree trees)Tree t = tree; if(trees.getName().equals(“pg“)t.setName

6、(“ceshi“); public static void main(String args) throws InterruptedException ExecutorService exec = Executors.newFixedThreadPool(10); for(int i=0;i();1:线程池的大小最好是设定好,因为JDK的管理内存毕竟是有限的; 2:使用结束,需要关闭线程池; 3: Runtime.getRuntime().addShutdownHook(hook); 对不能正常关闭的 线程做好相关的记录。Executors:ExecutorService严重注意:别设置线程池

7、无限大小入门版:CompletionService生产者消费者模式的简要实现版本。双剑合璧:Future+Callable任务池: ScheduledExecutorService计划任务执行相关的操作,使用java真幸福,选择多多!阻塞队列:BlockingQueue抛出异常特殊值阻塞超时 插入add(e)offer(e)put(e)offer(e, time, unit)移除remove()poll()take()poll(time, unit)检查element()peek()不可用不可用Kaopuability:插入(offer);移除(poll)BlockingQueue 的诸侯领地

8、ArrayBlockingQueue:一个由数组支持的有界阻塞队列。此队列 按 FIFO(先进先出)原则对元素进行排序。 Delayed 元素的一个无界阻塞队列,只有在延迟期满时才能从中 提取元素. LinkedBlockingDeque一个基于已链接节点的、任选范围的阻塞 双端队列。 LinkedBlockingQueue一个基于已链接节点的、范围任意的 blocking queue。此队列按 FIFO(先进先出)排序元素 PriorityBlockingQueue一个无界阻塞队列,它使用与类 PriorityQueue 相同的顺序规则,并且提供了阻塞获取操作。 SynchronousQue

9、ue一种阻塞队列,其中每个插入操作必须等待另 一个线程的对应移除操作 ,反之亦然。BlockingDeque:双端队列第一个元素(头部) 抛出异常特殊值阻塞超时期插入addFirst(e)offerFirst(e)putFirst(e)offerFirst(e, time, unit)移除removeFirst() pollFirst()takeFirst()pollFirst(time, unit)检查getFirst()peekFirst()不适用不适用 最后一个元素(尾部) 抛出异常特殊值阻塞超时期插入addLast(e)offerLast(e)putLast(e)offerLast(e

10、, time, unit)移除removeLast() pollLast()takeLast()pollLast(time, unit)检查getLast()peekLast()不适用不适用并发集合:你值得拥有同步的不是Map,是凤姐!ConcurrentHashMap:解放军38军你那飘逸的同步,分离锁的设计,再hash算法以及 游离于多个Segment的耍心跳的各种操作,都深深 的吸引了我。详细设计细节:http:/ -jtp08223/比较Map的性能CopyOnWriteArrayList,Set当读操作远远大于写操作的时候,考虑用这个并发集合。例如:维 护监听器的集合。注意:其频繁写

11、的效率可能低的惊人。奇技淫巧:屏蔽add带来的数组拷贝; public List array = new ArrayList(); public List list = new CopyOnWriteArrayList(array);同步器:四大金刚闭锁:CountDownLatch等 待 启 动 信 号线程A获得等待启动信号线程B获得等待启动信号线程C获得等待启动信号线程A运行,递减 锁存器的计数线程B运行,递减 锁存器的计数线程C运行,递减 锁存器的计数等 待 完 成 信 号继续启动信号+完成信号的模式N部分锁存器倒计数模式; 当线程必须用这种方法反复倒计数时,可改为使用 CyclicBa

12、rrier典型应用:手动控制事务,从数据库读取多份数据做初始化;关卡:CyclicBarrierBarrierABCABCBarrierBarrierABCA 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 its program. Th

13、e 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();)交换器:Exchanger1. 数据分解和数据流分解的一种技巧,可被视为 SynchronousQueue 的双向形式。 2. JDK5时支持2个线程之间交换数据,JDK6后支 持多个。至今我没有用过锁云:

14、你的柔情我永远不懂内部锁互斥锁分离锁 分拆锁闭锁独占锁读写锁顺序锁互斥锁: ReentrantLockLock 更加灵活,性能更好 interface Lock void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException; void unlock(); Condition newCondition(); 支持多个Condition 可以不以

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

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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 电子/通信 > 综合/其它

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