
多线程并发编程
隐者自怡悦
这个作者很懒,什么都没留下…
展开
-
countDownLatch和cyclicBarrier
由于在做接口的性能优化,最近也在学习并发编程的这块知识,刚好将理论应用于实战中。对了解到的东西不仅加深了印象,而且能够用起来,才达到了学习的目的。(1)当我们使用线程池进行并发编程时,后续操作需要依赖于并行线程执行的结果时,这时就可以考虑使用java并发包里的countDownLatch和cyclicBarrier来实现线程等待。 countDownLatch实现线程等待,它的计数器不可重复利用,每个线程执行完则退出线程,等待其他线程执行完; cyclicBarrier实现线程同步,即每原创 2020-05-09 15:51:37 · 273 阅读 · 0 评论 -
线程池工作机制
【线程池】在优化报名接口性能时,尤其注重了线程池的使用。不建议使用Executors,原因在于它里面的很多方法默认使用的都是无界的LinkedBlockingQueue,高并发情况下,无界队列很容易导致OOM,而OOM会导致所有请求都无法处理,这是灾难性问题。因此建议使用ThreadPoolExecutor来创建线程池管理我们的线程。线程池的7个参数配置有很大考究,在使用过程中注意分析自己的业务场景,进行合理的配置。总的可以总结为以下两点: 其一:小线程,大阻塞队列,意味着可以提高访问接口的吞吐...原创 2020-05-09 15:46:10 · 495 阅读 · 0 评论 -
双重检查锁
【双重检查锁】简单来说,就是在并发场景下,实现单列模式时,为解决单列模式的特性,以及性能的开销,在实例化时先判断对象是否已经初始化,再决定是否加锁,同时再进行对象二次判空验证。如以下示例代码所示: 注意:示例代码中“volatile”关键字是解决由于编译优化带来的有序性问题可能导致程序的执行顺序并不是我们所理解的那样,最终造成在多线程情况下,对象抛出空指针异常。而“volatile”就是告诉编译器禁止对该程序的优化。 以下简单给出在未指定“vol...原创 2020-05-09 15:25:42 · 373 阅读 · 0 评论 -
多线程并发编程(二)
【系统变慢】当前我们的服务器软件系统主要应用多线程技术实现多任务处理,并完成对很多用户的并发请求处理。简单来说,我们的一个web应用相当于操作系统中的一个进程,该进程中可以创建很多线程,而每个线程处理一个用户请求。在处理多个并发用户请求时。由于系统资源的有限性,从而在执行过程中引发运行时资源的竞争,系统为保证共享资源的线程安全,于是有了加锁的解决方案,即同一时刻只允许一个线程访问共享资源。锁会...原创 2020-05-08 14:10:50 · 208 阅读 · 0 评论 -
多线程并发编程(一)
在解决多线程并发带来的性能问题时,我们首先想到的一定是线程池。但配置线程池的几个关键参数时,必须基于生产环境系统资源以及线上流量,设置合理的参数值。线程数量设置太小,会导致程序不能充分地利用系统资源;线程数量设置太大,又可能带来资源的过度竞争,导致上下文切换造成额外的系统性能开销。尤其线程数量设置过大,最糟糕的情况就是会导致系统奔溃。其中特别提到的“上线文切换”指什么呢,这里简单说明下,首先必须先...原创 2020-05-08 13:42:14 · 199 阅读 · 0 评论