多线程设计模式学习记录篇
奋斗小亮
DayDayUp
展开
-
其他多线程设计模式
观察者设计模式观察线程的生命周期//使用观察者设计模式观察线程的生命周期 被观察者是Threadpublic abstract class ObservableRunnable implements Runnable { final protected LifeCycleListener listener; //观察者 public ObservableRunnable...原创 2020-04-23 21:33:52 · 234 阅读 · 0 评论 -
设计模式模块答疑
话题:设计模式模块热点问题答疑多线程设计模式是前人解决并发问题的经验总结,当我们试图解决一个并发问题时,首选方案往往是使用匹配的设计模式,这样能避免走弯路。同时,由于大家都熟悉设计模式,所以使用设计模式还能提升方案和代码的可理解性。避免共享的设计模式Immutability模式、Copy-on-Write模式和线程本地存储模式本质上都是为了避免共享,只是实现手段不同而已。这3种设计模式的实现...原创 2020-04-23 21:14:10 · 218 阅读 · 0 评论 -
生产者-消费者模式:用流水线思想提高效率
话题:生产者-消费者模式:用流水线思想提高效率Worker Thread模式类比的是工厂里车间工人的工作模式。但其实在现实世界,工厂里还有一种流水线的工作模式,类比到编程领域,就是生产者-消费者模式。生产者-消费者模式在编程领域的应用也非常广泛,前面我们曾经提到,Java线程池本质上就是用生产者-消费者模式实现的,所以每当使用线程池的时候,其实就是在应用生产者-消费者模式。当然,除了在线程池...原创 2020-04-23 20:59:09 · 677 阅读 · 0 评论 -
Two Phase Termination 设计模式:两阶段终止模式
话题:两阶段终止模式:如何优雅地终止线程?启动多线程去执行一个异步任务。既启动,那又该如何终止呢?今天咱们就从技术的角度聊聊如何优雅地终止线程,正所谓有始有终。线程执行完或者出现异常就会进入终止状态。这样看,终止一个线程看上去很简单啊!一个线程执行完自己的任务,自己进入终止状态,这的确很简单。不过我们今天谈到的“优雅地终止线程”,不是自己终止自己,而是在一个线程T1中,终止线程T2;这里所谓的...原创 2020-04-23 20:31:26 · 1284 阅读 · 2 评论 -
Worker Thread模式:如何避免重复创建线程
话题:Worker Thread模式:如何避免重复创建线程?在上一篇文章中,我们介绍了一种最简单的分工模式——Thread-Per-Message模式,对应到现实世界,其实就是委托代办。这种分工模式如果用Java Thread实现,频繁地创建、销毁线程非常影响性能,同时无限制地创建线程还可能导致OOM,所以在Java领域使用场景就受限了。要想有效避免线程的频繁创建、销毁以及OOM问题,就不得不...原创 2020-04-22 22:51:22 · 1264 阅读 · 0 评论 -
Thread-Per-Message模式:one to one 最简单实用的分工方法
话题:Thread-Per-Message模式:最简单实用的分工方法我们曾经把并发编程领域的问题总结为三个核心问题:分工、同步和互斥。其中,同步和互斥相关问题更多地源自微观,而分工问题则是源自宏观。我们解决问题,往往都是从宏观入手,在编程领域,软件的设计过程也是先从概要设计开始,而后才进行详细设计。同样,解决并发编程问题,首要问题也是解决宏观的分工问题。并发编程领域里,解决分工问题也有一系列的...原创 2020-04-22 22:00:07 · 389 阅读 · 0 评论 -
Balking模式:再谈线程安全的单例模式
话题:Balking模式:再谈线程安全的单例模式上一篇文章中,我们提到可以用**“多线程版本的if”**来理解Guarded Suspension模式,不同于单线程中的if,这个“多线程版本的if”是需要等待的,而且还很执着,必须要等到条件为真。但很显然这个世界,不是所有场景都需要这么执着,有时候我们还需要快速放弃。需要快速放弃的一个最常见的例子是各种编辑器提供的自动保存功能。自动保存功能的实...原创 2020-04-22 21:51:33 · 137 阅读 · 0 评论 -
Guarded Suspension模式:等待唤醒机制
话题:Guarded Suspension模式:等待唤醒机制的规范实现前不久,同事小灰工作中遇到一个问题,他开发了一个Web项目:Web版的文件浏览器,通过它用户可以在浏览器里查看服务器上的目录和文件。这个项目依赖运维部门提供的文件浏览服务,而这个文件浏览服务只支持消息队列(MQ)方式接入。消息队列在互联网大厂中用的非常多,主要用作流量削峰和系统解耦。在这种接入方式中,发送消息和消费结果这两个操...原创 2020-04-22 21:27:58 · 205 阅读 · 0 评论 -
线程本地存储模式:ThreadLocal
话题:线程本地存储模式:没有共享,就没有伤害线程封闭,其本质上就是避免共享。你已经知道通过局部变量可以做到避免共享,那还有没有其他方法可以做到呢?有的,Java语言提供的线程本地存储(ThreadLocal)就能够做到。下面我们先看看ThreadLocal到底该如何使用。ThreadLocal的使用方法下面这个静态类ThreadId会为每个线程分配一个唯一的线程Id,如果一个线程前后两次调用...原创 2020-04-22 21:00:07 · 486 阅读 · 0 评论 -
Copy-on-Write模式:写时复制
话题:Copy-on-Write模式:不是延时策略的COW在上一篇文章中我们讲到Java里String这个类在实现replace()方法的时候,并没有更改原字符串里面value[]数组的内容,而是创建了一个新字符串,这种方法在解决不可变对象的修改问题时经常用到。如果你深入地思考这个方法,你会发现它本质上是一种Copy-on-Write方法。所谓Copy-on-Write,经常被缩写为COW或者C...原创 2020-04-22 20:33:01 · 5328 阅读 · 0 评论 -
Immutability模式: 不可变对象设计模式
话题: Immutability模式:如何利用不变性解决并发问题?“多个线程同时读写同一共享变量存在并发问题”,这里的必要条件之一是读写,如果只有读,而没有写,是没有并发问题的。解决并发问题,其实最简单的办法就是让共享变量只有读操作,而没有写操作。这个办法如此重要,以至于被上升到了一种解决并发问题的设计模式:不变性(Immutability)模式。**所谓不变性,简单来讲,就是对象一旦被创建之...原创 2020-04-22 20:13:43 · 420 阅读 · 0 评论