Java并发编程实践分享.ppt
上传人:qw****27 上传时间:2024-09-12 格式:PPT 页数:30 大小:1MB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

Java并发编程实践分享.ppt

Java并发编程实践分享.ppt

预览

免费试读已结束,剩余 20 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Java并发编程实践分享——WA定时器编程经验分享以下方法哪个是线程安全第一个方法:privatestaticvoidtestList(){List<String>tests=newArrayList<String>();tests.add("a");tests.add("b");tests.add(“temp");tests.add("c");for(Stringtest:tests){if(test.equals("b")){tests.remove(“temp");}System.out.println(test);}}JUC简介线程池AtomicLock并发编程注意事项JDK1.5新增的类库提供并发编程中很常用的实用工具类线程池选哪个?多少线程合适?多大的队列合适?corePoolSize//核心池的大小maxPoolSize//最大池的大小keepAliveTime//超时时间workQueue//等待队列handler//饱和策略corePoolSize=CPU个数+1(计算密集型的操作)(JavaConcurrencyInPractice)AbortPolicy抛异常RejectedExecutionExceptionCallerRunsPolicy调度者执行DiscardOldestPolicy放弃最旧的未处理请求,执行新传入的任务DiscardPolicy不做任何操作,放弃新任务BlockingQueueput、take生产者与消费者(工作队列与线程池)新的请求超过线程池的处理能力,将请求放在队列中,而不是竞争CPU资源的线程队列,避免耗尽资源的情况出现ArrayBlockingQueue、LinkedBlockingDeque、SynchronousQueue注:如果任务之间有依赖,有限队列可能引起线程饥饿和死锁问题。各种线程池线程池两种常用策略:1、小池+大队列控制对CPU以及内存的使用,减少线程上下文切换2、大池+无队列大吞吐量、高效的移交任务WA使用Spring封装的线程池ThreadPoolTaskExecutorcoolPoolSize:5maxPoolSize:5Queue:LinkedBlockingQueue10000Handler:AbortPolicy批量执行下,需要记录每个线程是否执行完毕,来控制主线程是否继续下一个批量的执行AtomicInteger“可以用原子方式更新的int值。”CAS(CompareAndSet)volatile(线程可见性)非阻塞算法(乐观锁)privatevolatileintvalue;publicfinalintget(){returnvalue;}publicfinalintincrementAndGet(){for(;;){intcurrent=get();intnext=current+1;if(compareAndSet(current,next))returnnext;}}thread1synchronized与非阻塞算法1、使用硬件的原生指令,降低了争用的成本2、在轻度与中度争用情况下,更有性能优势3、重度争用时阻塞算法性能更好,但是重度的争用往往说明算法需要调整CountDownLatch(闭锁)确保特定的活动直到其他活动完成后才发生CountDownLatch(int)await()countDown()publicstaticvoidfinishOneTask(){latch.countDown();}publicstaticvoidisFinish()throwsInterruptedException{latch.await();}publicstaticvoidinit(intinitNum){latch=newCountDownLatch(initNum);}第三个问题synchronized与Lock比较ReentrantLocklock=LimitSendNumUtil.getLock();try{lock.lock();if(!LimitSendNumUtil.isSend()){//线程sleepThread.sleep(sleepTime);}AliMailClient.synSend(mail);}finally{LimitSendNumUtil.send();if(lock.isLocked()){lock.unlock();}}并发容器并发编程注意事项误吃掉中断的后果InterruptedException1、中断是一种协作机制,其他线程不能够迫使其他线程停止。2、中断可以认为是“