java并发编程实践分享

上传人:e****s 文档编号:243684718 上传时间:2024-09-28 格式:PPT 页数:30 大小:302KB
返回 下载 相关 举报
java并发编程实践分享_第1页
第1页 / 共30页
java并发编程实践分享_第2页
第2页 / 共30页
java并发编程实践分享_第3页
第3页 / 共30页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,Java,并发编程实践分享,WA,定时器编程经验分享,以下方法哪个是线程平安,第一个方法:,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 testList() ,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);,tests.add(“temp);,tests.add(c);,for(String test : tests),if(test.equals(b),tests.remove(“temp);,System.,out.println(test);,执行结果什么?,JUC简介,线程池,Atomic,Lock,并发编程本卷须知,新增的类库,提供并发编程中很常用的实用工具类,线程池选哪个?多少线程适宜?多大的队列适宜?,第一个问题,ThreadPoolExecutor,Executors,BlockingQueue,corePoolSize /核心池的大小maxPoolSize /最大池的大小keepAliveTime /超时时间workQueue /等待队列handler /饱和策略corePoolSize =CPU个数+1计算密集型的操作Java Concurrency In Practice AbortPolicy 抛异常RejectedExecutionException CallerRunsPolicy 调度者执行 DiscardOldestPolicy放弃最旧的未处理请求,执行新传入的任务 DiscardPolicy 不做任何操作,放弃新任务,BlockingQueue,put 、take,生产者与消费者工作队列与线程池,新的请求超过线程池的处理能力,将请求放在队列中,而不是竞争CPU资源的线程队列,防止耗尽资源的情况出现,ArrayBlockingQueue、 LinkedBlockingDeque、 SynchronousQueue,注:如果任务之间有依赖,有限队列可能引起线程饥饿和死锁问题。,各种线程池,线程池,SingleThreadPool,CachedThreadPool,FixedThreadPool,coolPoolSize,1,0,-,maxPoolSize,1,Integer.MAX_VALUE,-,Queue,LinkedBlockingQueue,SynchronousQueue,LinkedBlockingQueue,handler,AbortPolicy,AbortPolicy,AbortPolicy,keepAliveTime,0,60min,0,线程池两种常用策略:,1,、小池,+,大队列,控制对,CPU,以及内存的使用,减少线程上下文切换,2,、大池,+,无队列,大吞吐量、高效的移交任务,WA,使用,Spring,封装的线程池,ThreadPoolTaskExecutor,coolPoolSize,:,5,maxPoolSize,:,5,Queue,:,LinkedBlockingQueue,10000,Handler,:,AbortPolicy,批量执行下,需要记录每个线程是否执行完毕,来控制主线程是否继续下一个批量的执行,第二个问题,计数器?,并发?,synchronized,?,AtomicInteger,“可以用原子方式更新的 int 值。,CASCompare And Set,volatile线程可见性,非阻塞算法乐观锁,private volatile int value;,public final int get() return value; ,public final int incrementAndGet() for (;) int current = get(); int next = current + 1; if (compareAndSet(current, next) return next; ,thread1,thread2,thread3,thread4,Heap,Perm gen Heap,code,Stack,Stack,Stack,Stack,obj,obj,obj,Native heap,OS task scheduler,CPU,core1,core2,CPU,core1,core2,CPU,core1,core2,CPU,core1,core2,synchronized与非阻塞算法,1、使用硬件的原生指令,降低了争用的本钱,2、在轻度与中度争用情况下,更有性能优势,3、重度争用时阻塞算法性能更好,但是重度的争用往往说明算法需要调整,CountDownLatch闭锁确保特定的活动直到其他活动完成后才发生 CountDownLatch (int)await()countDown(),public 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提供更好的灵活度和可伸缩性,3、 在中Lock的性能明显强于synchronized,中差距不明显,4、使用Lock一定要记住在finally释放锁,ReentrantLock lock = LimitSendNumUtil.getLock();,try ,lock.lock();,if (!LimitSendNumUtil.isSend() ,/,线程,sleep,Thread.sleep(sleepTime);,AliMailClient.synSend(mail);,finally ,LimitSendNumUtil.send();,if (lock.isLocked(),lock.unlock();,并发容器,ConcurrentHashMap,线程平安,支持并发、无阻塞,锁别离,volatile 、读不加锁,较HashMap,高并发情景下50-100线程并发添加和删除性能提高一倍,查找性能提高10倍,并发编程本卷须知,1、线程设置名称,2、Atomic+Atomic!=Atomic,3、响应中断InterruptedException,4、不要误杀线程(运行定时器时要使全部线程都结束才可以退出),5、编写多线程程序,要加相关注释方法是否线程平安、适用在那种场景使用此类或方法,6、使用Lock要在finally中释放Lock,7、使用volatile只能增加可见性,没有同步语义,8、调试Java多线程代码的指令,jps,jstack pid,visualvm图形界面,误吃掉中断的后果,InterruptedException,1、中断是一种协作机制,其他线程不能够迫使其他线程停止。,2、中断可以认为是“提醒。,3、响应中断的阻塞方法可以更容易的取消耗时的操作。,响应线程中断的两种方式:,1、传递InterruptedException,2、恢复中断,Thread.currentThread().interrupt(),Thread 7371: (state = BLOCKED),- java.lang.Object.wait(long) bci=0 (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,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 各类标准


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!