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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

Java并发编程实践分享PPT课件.ppt

1、Java并发编程实践分享 WA定时器编程经验分享,cesc.wangl,以下方法哪个是线程安全,第一个方法: public void add(int i) i+; ,第二个方法: public Object getLast(List list) int lastIndex=list.size()-1;return list.get(lastIndex); ,第三个方法: public Object getLast(Vector v) int lastIndex=v.size()-1;return v.get(lastIndex); ,第一个方法: private static void tes

2、tList() List tests=new ArrayList(); tests.add(“a“); tests.add(“b“); tests.add(“temp“); tests.add(“c“); for(String test : tests) if(test.equals(“b“) tests.remove(“temp“); System.out.println(test); ,第二个方法: private static void testVector() Vector tests=new Vector(); tests.add(“a“); tests.add(“b“); test

3、s.add(“temp“); tests.add(“c“); for(String test : tests) if(test.equals(“b“) tests.remove(“temp“); System.out.println(test); ,执行结果什么?,JUC简介 线程池 Atomic Lock 并发编程注意事项,JDK1.5新增的类库 提供并发编程中很常用的实用工具类,线程池选哪个?多少线程合适?多大的队列合适?,第一个问题,ThreadPoolExecutor Executors BlockingQueue,corePoolSize /核心池的大小 maxPoolSize /最

4、大池的大小 keepAliveTime /超时时间 workQueue /等待队列 handler /饱和策略 corePoolSize =CPU个数+1(计算密集型的操作)(Java Concurrency In Practice) AbortPolicy 抛异常RejectedExecutionException CallerRunsPolicy 调度者执行 DiscardOldestPolicy放弃最旧的未处理请求,执行新传入的任务 DiscardPolicy 不做任何操作,放弃新任务,BlockingQueueput 、take生产者与消费者(工作队列与线程池)新的请求超过线程池的处理

5、能力,将请求放在队列中,而不是竞争CPU资源的线程队列,避免耗尽资源的情况出现ArrayBlockingQueue、 LinkedBlockingDeque、 SynchronousQueue注:如果任务之间有依赖,有限队列可能引起线程饥饿和死锁问题。,各种线程池,线程池两种常用策略: 1、小池+大队列 控制对CPU以及内存的使用,减少线程上下文切换 2、大池+无队列 大吞吐量、高效的移交任务WA使用Spring封装的线程池ThreadPoolTaskExecutor coolPoolSize:5 maxPoolSize:5 Queue: LinkedBlockingQueue 10000 H

6、andler: AbortPolicy,批量执行下,需要记录每个线程是否执行完毕,来控制主线程是否继续下一个批量的执行,第二个问题,计数器? 并发? synchronized ?,AtomicInteger“可以用原子方式更新的 int 值。”CAS(Compare And Set) volatile(线程可见性) 非阻塞算法(乐观锁),private volatile int value; public final int get() return value; public final int incrementAndGet() for (;) int current = get(); i

7、nt next = current + 1; if (compareAndSet(current, next) return next; ,CPU,core1,core2,CPU,core1,core2,CPU,core1,core2,synchronized与非阻塞算法 1、使用硬件的原生指令,降低了争用的成本 2、在轻度与中度争用情况下,更有性能优势 3、重度争用时阻塞算法性能更好,但是重度的争用往往说明算法需要调整,CountDownLatch(闭锁) 确保特定的活动直到其他活动完成后才发生 CountDownLatch (int) await() countDown(),public

8、static void finishOneTask() latch.countDown(); public static void isFinish() throws InterruptedException latch.await(); public static void init(int initNum) latch = new CountDownLatch(initNum); ,第三个问题,如何精确控制发送速率?,synchronized Lock ReentrantLock,synchronized 与Lock比较,1、Lock与synchronized功效是一样的 2、Lock提供

9、更好的灵活度和可伸缩性 3、 在Java1.5中Lock的性能明显强于synchronized,1.6中差距不明显 4、使用Lock一定要记住在finally释放锁,ReentrantLock lock = LimitSendNumUtil.getLock(); try lock.lock(); if (!LimitSendNumUtil.isSend() /线程sleepThread.sleep(sleepTime); AliMailClient.synSend(mail); finally LimitSendNumUtil.send(); if (lock.isLocked() lock.

10、unlock(); ,并发容器,ConcurrentHashMap 线程安全 支持并发、无阻塞 锁分离 volatile 、读不加锁 较HashMap,高并发情景下(50-100线程并发)添加和删除性能提高一倍,查找性能提高10倍,并发编程注意事项,1、线程设置名称 2、Atomic+Atomic!=Atomic 3、响应中断InterruptedException 4、不要误杀线程(运行定时器时要使全部线程都结束才可以退出) 5、编写多线程程序,要加相关注释(方法是否线程安全、适用在那种场景使用此类或方法) 6、使用Lock要在finally中释放Lock 7、使用volatile只能增加可

11、见性,没有同步语义 8、调试Java多线程代码的指令jpsjstack pidvisualvm(图形界面),误吃掉中断的后果,InterruptedException 1、中断是一种协作机制,其他线程不能够迫使其他线程停止。 2、中断可以认为是“提醒”。 3、响应中断的阻塞方法可以更容易的取消耗时的操作。 响应线程中断的两种方式: 1、传递InterruptedException 2、恢复中断 Thread.currentThread().interrupt(),Thread 7371: (state = BLOCKED)- java.lang.Object.wait(long) bci=0

12、(Compiled frame; information may be imprecise)- java.lang.Object.wait() bci=2, line=474 (Compiled frame)Thread 7357: (state = IN_NATIVE)- org.eclipse.swt.internal.gtk.OS.Call(int, int, int, int) bci=0 (Compiled frame; information may be imprecise)- org.eclipse.swt.widgets.Display.sleep() bci=265, line=3893 (Compiled frame)- org.eclipse.ui.application.WorkbenchAdvisor.eventLoopIdle(org.eclipse.swt.widgets.Display) bci=1, line=364 (Compiled frame)- org.eclipse.ui.internal.Workbench.runUI() bci=393, line=2369 (Interpreted frame),Thanks,

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


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

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

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