Java并发编程龙浩在一个list中有过亿条的Integer类型的值,如何更快的计算这些值的总和?一个计算的问题简单的方法:更快的CPU来遍历靠谱的方法:分而治之来处理进一步的方法:Fork/jion简单的方法靠谱么?免费午餐已经结束——软件历史性地向并发靠拢软层次上:遍历是不靠谱的,for小学生了!靠谱的方法简单么?(分而治之)list1list2list3ConcurrencyThreadThreadThread那帮Java大神在他们书中说:在对性能的追求很可能是并发bug唯一最大的来源!So:同样不是免费的午餐,需要学习和批量实践。目录线程并发编程(juc)线程监控工具编程思想和实践Fork/Jion框架Visibility:通过并发线程修改变量值,必须将线程变量同步回主存后,其他线程才能访问到。Ordering:通过java提供的同步机制或volatile关键字,来保证内存的访问顺序。Cachecoherency:它是一种管理多处理器系统的高速缓存区结构,其可以保证数据在高速缓存区到内存的传输中不会丢失或重复。Happens-beforeordering:synchronized,volatile,final,java.util.concurrent.lock|atomic线程:先让路给内存模型这里有详述:(别迷恋哥,哥只是传说!)内存中的可见部分Stack-1Stack-2Stack-3GlobalsHeap线程:synchronized类同步方法同步块同步内部锁分拆锁保证原子性和可见性线程:JavaMonitorsThisfigureshowsthemonitorasthreerectangles.Inthecenter,alargerectanglecontainsasinglethread,themonitor'sowner.Ontheleft,asmallrectanglecontainstheentryset.Ontheright,anothersmallrectanglecontainsthewaitset.Activethreadsareshownasdarkgraycircles.Suspendedthreadsareshownaslightgraycircles.线程:独占锁(synchronized)非方法修饰符,注意方法覆写的时候需要加上synchronized;经典的顺序锁问题(两个线程安全的方法放在一起线程安全么?)getClass的问题。……分拆前:思考问题,顺便教你一招!分拆不了人,工具还不能分拆么?对,买3个手机去……线程:分拆锁线程:分离锁分离锁负面作用:对容器加锁,进行独占访问更加困难,并且更加昂贵了。内存使用的问题:sina就曾经因为在Action层使用ConcurrentHashMap而导致内存使用过大,修改array后竟然单台服务器节省2G。线程:static的案例publicclassStaticThreadTest{//线程避免调用这个;publicstaticTreetree=newTree(“jizi”,“2”);publicstaticvoidcreateTree(Treetrees){Treet=tree;if(trees.getName().equals(pg)){t.setName(ceshi);}}publicstaticvoidmain(String[]args)throwsInterruptedException{ExecutorServiceexec=Executors.newFixedThreadPool(10);for(inti=0;i10;i++){exec.execute(newTreeThread(i));Thread.sleep(50);}exec.shutdown();exec.awaitTermination(1,TimeUnit.SECONDS);}}线程:可见性volatile关键字:1:简化实现或者同步策略验证的时候来使用它;2:确保引用对象的可见性;3:标示重要的生命周期的事件,例如:开始或者关闭。脆弱的volatile的使用条件:1:写入变量不依赖变量的当前值,或者能够保证只有单一的线程修改变量的值;2:变量不需要和其他变量共同参与不变约束;3:访问变量时不需要其他原因需要加锁。privatevolatilebooleanisInterrupted=false;任务的取消和线程超时线程中断教父JoshuaBloch说线程:1.对共享可变数据同步访问;2.避免过多的同步;3.永远不要在循环外面调用wait;4.不要依赖于线程调度器;5.线程安全的文档化;6.避免使用线程组。目录线程并发编程(juc)线程监控工具编程思想和实践Fork/Jion框架开始并发编程了行动之前,拜神先1.Mr.concurrency,当今世界上并发程序设计领域的先驱,著名学者。他是util.concurrent包的作者,JSR166规范的制定。2.图书著作《ConcurrentProgramminginJava:DesignPrinciplesandPatterns》。3.其”AScalableElimination-basedExchangeChannel”和”ScalableSynchronousQueues”两篇论文列为非阻塞同步算法的经典文章。4.Afork/jionframework同样影响着java7。DougLea并发编程:三大定律(1)讨论的是加速比(speedup)的问题Gustafson定律并发编程:三大定律(2)Gustafson假设随着处理器个数的增加,并行与串行的计算总量也是可以增加的。Gustafson定律认为加速系数几乎跟处理器个数成正比,如果现实情况符合Gustafson定律的假设前提的话,那么软件的性能将可以随着处理个数的增加而增加。Sun-Ni定律并发编程:三大定律(3)充分利用存储空间等计算资源,尽量增大问题规模以产生更好/更精确的解。总结不是API,是寂寞!来个高清无码版Executors•Executor•ExecutorService•ScheduledExecutorService•Callable•Future•ScheduledFuture•Delayed•CompletionService•ThreadPoolExecutor•ScheduledThreadPoolExecutor•AbstractExecutorService•Executors•FutureTask•ExecutorCompletionServiceQueues•BlockingQueue•ConcurrentLinkedQueue•LinkedBlockingQueue•ArrayBlockingQueue•SynchronousQueue•PriorityBlockingQueue•DelayQueueConcurrentCollections●ConcurrentMap●ConcurrentHashMap●CopyOnWriteArray{List,Set}Synchronizers●CountDownLatch●Semaphore●Exchanger●CyclicBarrierTiming●TimeUnitLocks●Lock●Condition●ReadWriteLock●AbstractQueuedSynchronizer●LockSupport●ReentrantLock●ReentrantReadWriteLockAtomics●Atomic[Type],Atomic[Type]Array●Atomic[Type]FieldUpdater●Atomic{Markable,Stampable}ReferenceThreadPoolExecutor:自己动手,丰衣足食!publicstaticExecutorServicenewFixedThreadPool(intnThreads){returnnewThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLISECONDS,newLinkedBlockingQueueRunnable());}1:线程池的大小最好是设定好,因为JDK的管理内存毕竟是有限的;2:使用结束,需要关闭线程池;3:Runtime.getRuntime().addShutdownHook(hook);对不能正常关闭的线程做好相关的记录。Executors:ExecutorServicenewFixedThreadPoolnewSingleThreadExecutornewCachedThreadPoolnewSingleThreadScheduledExecutorExecutorService严重注意:别设置线程池无限大小入门版:CompletionService生产者消费者模式的简要实现版本。双剑合璧:Future+Callable任务池:ScheduledExecutorServiceTimer+TimeTaskScheduledExecutorServcie+DelayQeuueQuartz计划任务执行相关的操作,使用java真幸福,选择多多!阻塞队列:BlockingQueue抛出异常特殊值阻塞超时插入add(e)offer(e)put(e)offer(e,time,unit)移除remove()poll()take()poll(time,unit)检查element()peek()不可用不可用Kaopuability:插入(offer);移除(poll)BlockingQueue的诸侯领地子类抽象类接口BlockingQueueAbstractQueueArrayBlockingQueueDelayQueueLinkedBlockingDequeLinkedBlockingQueuePriorityBlockingQueueSynchronousQueue•ArrayBlockingQueue:一个由数组支持的有界阻塞队列。此队列按FIFO(先进先出)原则对元素进行排序。•Delayed元素的一个无界阻塞队列,只有在延迟期满时才能从中提取元素.•LinkedBlockingDeque一个基于已链接节点的、任选范围的阻塞双端队列。•LinkedBlockingQueue一个基于已链接节点的、范围任意的blockingqueue。此队列按FIFO(先进先出)排序元素•PriorityBlockingQueue一个无界阻塞队列,它使用与类PriorityQueue相同的顺序规则,并且提供了阻塞获取操作。•SynchronousQueue一种阻塞队列,其中每个插入操作必须等待另一个线程的对应移除操作,反之亦然。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,time,unit)移除removeLast()pollLast()takeLast()pollLast(time,unit)检查getLast()peekLast()不适用不适用并发集合:你值得拥有同步的不是Map,是凤姐!ConcurrentHashMap:解放军38军你那飘逸的同步,分