Java并发案例05---Master-Worker模式】的更多相关文章

Master-Worker 模式是常用的并行计算模式.它的核心思想是系统由两类进程协同工作,Master和Worker进程.Master负责接收和分配任务,Worker负责处理子任务.当各个Worker子进程处理完毕后,会将结果返回给Master,由Master做归纳和小结.其好处是能够将一个大任务分解成若干个小任务,并行执行,从而提高系统的吞吐量. Master-Worker模式结构图 代码架构: Master 负责接收和分配任务 Worker 负责处理子任务 Main 主函数,启动类 Mas…
本文源码:GitHub·点这里 || GitEE·点这里 一.资源和加锁 1.场景描述 多线程并发访问同一个资源问题,假如线程A获取变量之后修改变量值,线程C在此时也获取变量值并且修改,两个线程同时并发处理一个变量,就会导致并发问题. 这种并行处理数据库的情况在实际的业务开发中很常见,两个线程先后修改数据库的值,导致数据有问题,该问题复现的概率不大,处理的时候需要对整个模块体系有概念,才能容易定位问题. 2.演示案例 public class LockThread01 { public stat…
本文源码:GitHub·点这里 || GitEE·点这里 一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个可以"克隆"自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例.这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再去通过new来创…
1.简单工厂模式 在不考虑扩展的情况下还是很好用的,其实我们写代码也很经常用到,其主要理解在于传入不同参数则构建不同对象,只有一个工厂,如需添加产品涉及到扩展需要修改比较多的东西,不符合开闭原则,如下例子所示,传入A则获得ABook,传入B则获得BBook: package main.java.com.learn.factory.factory; public interface Book { void getKnowledge(); } package main.java.com.learn.…
自己对线程池的理解: coresize 3 maxsize 5 blockLinkedQuenue 3 当提交的任务在<=3时,创建三个线程干活 大于3时,把任务先加入阻塞式队列,当有空闲的核心线程便去执行他们,队列中的任务执行是实际运行的线程在复用执行 如果后面有提交了很多任务,队列都放不下了,就赶紧创建新的线程去执行他们,如果任务已经大于了>队列+最大线程数,没有能力干活了,只能崩塌了,抛出拒绝异常 一.合理配置线程池 CPU密集 CPU密集的意思是该任务需要大量的运算,而没有阻塞,CPU…
代理模式就是用一个第三者的身份去完成工作,其实际意义跟字面意思其实是一样的,理解方式有很多,还是例子直观. 本例的实现类是实现买票功能,实际应用想要添加身份验证功能,利用代理模式添加验证步骤.上例子: package com.learn.proxy.proxyModel; /** * 初始功能接口,买票 * @author garfield * */ public interface Tickets { public abstract void buy(); } package com.lear…
/** * 面试题:写一个固定容量同步容器,拥有put和get方法,以及getCount方法, * 能够支持2个生产者线程以及10个消费者线程的阻塞调用 * * 使用wait和notify/notifyAll来实现 * * 使用Lock和Condition来实现 * 对比两种方式,Condition的方式可以更加精确的指定哪些线程被唤醒 * * @author maple */ //同步互斥,等待队列, 基于AQS package yxxy.c_021; import java.util.Lin…
package example; import java.util.LinkedList; import java.util.concurrent.TimeUnit; public class MyContainer3<T> { final private LinkedList<T> lists = new LinkedList<T>(); final private int MAX = 10; //最多10个元素 private int count = 0; publ…
多线程之死锁案例一 package example; /** * 模拟死锁 * @author maple * */ public class DeadLock { public int flag = 1; /** * 这里必须要用静态的锁对象,o1,o2 * 因为new两个对象时,他们共享静态变量,持有的锁才会有冲突 */ private static Object o1 = new Object(); private static Object o2 = new Object(); publ…
先看一个问题: 有两个线程,子线程先执行10次,然后主线程执行5次,然后再切换到子线程执行10,再主线程执行5次--如此往返执行50次. 看完这个问题,很明显要用到线程间的通信了, 先分析一下思路:首先肯定要有两个线程,然后每个线程中肯定有个50次的循环,因为每个线程都要往返执行任务50次,主线程的任务是执行5次,子线程的任务是执行10次.线程间通信技术主要用到 wait() 方法和 notify() 方法.wait() 方法会导致当前线程等待,并释放所持有的锁,notify() 方法表示唤醒在…