java并发编程实践分享_第1页
java并发编程实践分享_第2页
java并发编程实践分享_第3页
java并发编程实践分享_第4页
java并发编程实践分享_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、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 Arr

2、ayList();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(t

3、est.equals(b)tests.remove(“temp);System.out.println(test);执行结果什么?JUC简介线程池AtomicLock并发编程本卷须知新增的类库提供并发编程中很常用的实用工具类线程池选哪个?多少线程适宜?多大的队列适宜?第一个问题ThreadPoolExecutorExecutorsBlockingQueuecorePoolSize /核心池的大小maxPoolSize /最大池的大小keepAliveTime /超时时间workQueue /等待队列handler /饱和策略corePoolSize =CPU个数+1计算密集型的操作Java C

4、oncurrency In Practice AbortPolicy 抛异常RejectedExecutionException CallerRunsPolicy 调度者执行 DiscardOldestPolicy放弃最旧的未处理请求,执行新传入的任务 DiscardPolicy 不做任何操作,放弃新任务BlockingQueueput 、take生产者与消费者工作队列与线程池新的请求超过线程池的处理能力,将请求放在队列中,而不是竞争CPU资源的线程队列,防止耗尽资源的情况出现ArrayBlockingQueue、 LinkedBlockingDeque、 SynchronousQueue注:

5、如果任务之间有依赖,有限队列可能引起线程饥饿和死锁问题。各种线程池线程池SingleThreadPoolCachedThreadPoolFixedThreadPoolcoolPoolSize10-maxPoolSize1Integer.MAX_VALUE-QueueLinkedBlockingQueueSynchronousQueueLinkedBlockingQueuehandlerAbortPolicyAbortPolicyAbortPolicykeepAliveTime060min0线程池两种常用策略:1、小池+大队列控制对CPU以及内存的使用,减少线程上下文切换2、大池+无队列大吞吐量

6、、高效的移交任务WA使用Spring封装的线程池ThreadPoolTaskExecutorcoolPoolSize:5maxPoolSize:5Queue: LinkedBlockingQueue 10000Handler: AbortPolicy批量执行下,需要记录每个线程是否执行完毕,来控制主线程是否继续下一个批量的执行第二个问题计数器?并发?synchronized ?AtomicInteger“可以用原子方式更新的 int 值。CASCompare And Setvolatile线程可见性非阻塞算法乐观锁private volatile int value;public final

7、int get() return value; public final int incrementAndGet() for (;) int current = get(); int next = current + 1; if (compareAndSet(current, next) return next; thread1thread2thread3thread4HeapPerm gen HeapcodeStackStackStackStackobjobjobjNative heapOS task schedulerCPUcore1core2CPUcore1core2CPUcore1co

8、re2CPUcore1core2synchronized与非阻塞算法1、使用硬件的原生指令,降低了争用的本钱2、在轻度与中度争用情况下,更有性能优势3、重度争用时阻塞算法性能更好,但是重度的争用往往说明算法需要调整CountDownLatch闭锁确保特定的活动直到其他活动完成后才发生 CountDownLatch (int)await()countDown()public static void finishOneTask() latch.countDown(); public static void isFinish() throws InterruptedException latch.a

9、wait(); public static void init(int initNum) latch = new CountDownLatch(initNum); 第三个问题如何精确控制发送速率?synchronizedLockReentrantLocksynchronized与Lock比较1、Lock与synchronized成效是一样的2、Lock提供更好的灵活度和可伸缩性3、 在中Lock的性能明显强于synchronized,中差距不明显4、使用Lock一定要记住在finally释放锁 ReentrantLock lock = LimitSendNumUtil.getLock(); t

10、ry lock.lock(); if (!LimitSendNumUtil.isSend() /线程sleepThread.sleep(sleepTime); AliMailClient.synSend(mail);finally LimitSendNumUtil.send(); if (lock.isLocked() lock.unlock(); 并发容器ConcurrentHashMap线程平安支持并发、无阻塞锁别离volatile 、读不加锁较HashMap,高并发情景下50-100线程并发添加和删除性能提高一倍,查找性能提高10倍并发编程本卷须知1、线程设置名称2、Atomic+Ato

11、mic!=Atomic3、响应中断InterruptedException4、不要误杀线程(运行定时器时要使全部线程都结束才可以退出)5、编写多线程程序,要加相关注释方法是否线程平安、适用在那种场景使用此类或方法6、使用Lock要在finally中释放Lock7、使用volatile只能增加可见性,没有同步语义8、调试Java多线程代码的指令jpsjstack pidvisualvm图形界面误吃掉中断的后果InterruptedException 1、中断是一种协作机制,其他线程不能够迫使其他线程停止。2、中断可以认为是“提醒。3、响应中断的阻塞方法可以更容易的取消耗时的操作。响应线程中断的两

12、种方式:1、传递InterruptedException2、恢复中断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) - ernal.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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论