`
文章列表
在说简单工厂模式之前,我们先来了解下活字印刷术。 古时候没有现在这么现代化,都是先刻好印版,然后用印版将文章去印在纸上。每写一篇,都得刻一版,好累。 毕昇,是个头脑很灵活的工匠,他就在想,如果我把每个字都单独刻出来,你用的时候自己去组合,这样不就省事了,因此,一项伟大的发明就出现了---活字印刷术。 活字印刷术有4大特点: 第一,要改文章的字,只需要替换对应的字模就行,这是可维护。 第二,每个字模可以多次使用,这是可复用。 第三,如果文章中用到的字没有,可以新刻一个对应的字,这是可扩展。 第四,如果想改变文章的排版,只需要改变字模的方向就行,灵活性好。   我们在开发中,经 ...
在说策略模式之前,我们先来分析一个需求。 一、需求分析及实现过程 某商场经常有促销活动,第一次是满200送80,第二次是所有商品打8折,第三次是所有商品打9折,第四次是满300送120等等。如果让你设计你怎么做? 我们都在说面向对象编程,但是并不是类越多越好。分类的目的是为了抽象,将所有共性(相同的属性和功能)的对象抽象成一个类。 我们先来找共性,打折类的需求我们可以抽象成一个需求,因为他们的共性就是折扣率和原价。 满多少送多少类可以抽象成一个需求,因为他们的共性就是总价和扣除价。 正常价是原价。 从需求中我们可以看到,我们现在有三类需求,这三类需求分别抽象成三个共性类:正常价 ...
在设计模式中,代理模式是经常会用到的一种模式。但是光说设计模式,没有实际意义。在Mybatis源码系列中,用到了该设计模式,因此,我们结合Mybatis使用的代理模式过程,来分析下如何使用代理模式,代理模式的核心是什么。 一、基于接口的代理模式 在讲代理模式的时候,我想起在大话模式中讲的一个故事。A暗恋B,想给B送个礼物,但是又不能直接给B送去。因此,它去礼物店,买了一件礼物,告诉店员心仪的B的信息,让店员送过去,这里,店员就帮忙完成了A想送礼物给B的事情。这里的店员,就是代理者的角色。 那我们用代码如何去实现以上过程呢?我们首先讲第一种方式---静态代理模式。 1、静态代理 为什 ...
在源码解析篇三中,我们已经得到了SqlSession。长征已经走了一半,前途一片光明。此篇中我们要解析下如何使用SqlSession去进行CRUD(创建(Create)、查询(Retrieve)(重新得到数据)、更新(Update)和删除(Delete))。 我们结合debug过程,逐渐深入源码解析。 一、从getMapper说起 在我们入门示例中,使用sqlSession.getMapper(MalltUserDao.class)获取到了MalltUserDao,那这中间经历了什么?下面是整个执行过程的时序图。   我们从sqlSession的getMapper方法开始深入,源码 ...
上一篇MyBatis源码解析系列中,我们说完了SqlSessionFactory的诞生过程。这一篇中,我们要根据SqlSessionFactory工厂去得到SqlSession。那么,在这个过程中,究竟做了些什么?我们一一去解读。 一、SqlSession怎么来的 SqlSession是一个接口类,继承了Closeable(只有一个从AutoCloseable接口类继承来的方法close)。在SqlSession接口类中,提供了各种查询、删除、更新、提交、回滚等等方法。我们看类图:    既然是个接口类,那么总要有实现类去做这些事情,才能显示出接口类的价值。那么SqlSession是怎 ...
看过此篇,你就赚到了。别人写的源码系列,虽然有源码,但是没有关键的图示和debug过程,只是讲了有啥用,不适用。在我写的MyBatis源码系列中,都会结合debug过程+图示来阐述,我们从SqlSessionFactoryBuilder说起。SqlSessionFactoryBuilder,见名知意,是SqlSessionFactory的建造者(Builder)。那么我们猜想,既然是建造SqlSessionFactory,如果让我去写,那么总需要提供一个全参数的建造方法和一些特定参数的建造方法。我们的猜想对与否?验证一下。 一、SqlSessionFactoryBuilder源码解析 在 ...
MyBatis其实很简单。我们在工作中使用的通常是与Spring整合,Spring作为框架粘合剂,简化了很多使用实现细节。为了研究MyBatis源码,我们需要单从MyBatis的使用来作为入口,循着会用到源码来深入。 一、MyBatis是什么?能做什么 ...
我们接上篇,继续解密ForkJoinPool中的结果归并,其实很简单。 结果归并是是在计算任务完成后。我们还以上一篇帖子中的计算为例。 二、join()方法解密 上一篇最后,这时线程Thread[ForkJoinPool-1-worker-3,5,main]处理的任务【1,125】经过execTask等一系列方法后,调用computer方法,此时达到阈值,调用for循环开始计算结果,最终得到结果7875,并且设置。同理Thread[ForkJoinPool-1-worker-4,5,main]线程处理的任务【126,250】经过计算得到最后的结果23500。 这里要注意下,执行完各自 ...
我们接上篇,继续说下ForkJoinPool中任务分拆方法fork。 一、fork()方法解密 为了更简明的说明整个调用过程,我们把计算范围再次缩小为:【1,500】。   package com.sitech.threadPool; import java.util.concurrent.ForkJoinPool; import java.ut ...
在JDK1.7中,JDK的并发包下新增了一个框架:ForkJoin框架(它只是一种思想,别一听框架就又懵了)。Fork在英文中是叉子的意思,Join是最后归集的意思,我们可以想象一下,你用叉子(ForkJoin框架)去拿一块牛排,分叉的部分合力将牛排叉住(共同处理任务),把儿的部分(Join)可以让我们用它来拿起牛排放到嘴里(最后的结果)。。。。   上面描述了一个过程,我们把这个过程叫做:分而治之。见下图   接触过大数据的童鞋应该都知道,分而治之方法是一个非常有效的处理大量数据的方法。大数据中MapReduce就是采用了这种方法,将任务分拆,使用多个节点去处理部分任务,然后再用归 ...
前三篇说了线程池一些核心东西,这一篇,我想就线程池的使用从全流程的角度来说下,线程池是如何工作的。   我们以一个调用示例,来逐步深入。 一、固定大小线程池调用示例 1、我们先创建一个corePoolSize大小为5的线程池,然后提交10个任务。   public class ThreadPoolDemo { public static class MyTask implements Runnable{ @Override public void run() { // TODO Auto-generated method stub Syst ...
在ThreadPoolExecutor的核心构造函数中,最后一个参数就是拒绝策略处理器。拒绝策略是等待任务队列已满,并且线程池处理不了任务时候,就需要一套处理机制,去解决这个问题(是抛弃还是怎么的)。 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, ...
在JDK的并发包java.util.concurrent下,我们可以找找定义的队列有哪些。我们按照字典序排一下: ArrayBlockingQueue,LinkedBlockingQueue,PriorityBlockingQueue,SynchronousQueue。 那定义的这些队列是要用在哪?当然是我们上一帖线程池核心构造函数中说的BlockingQueue<Runnable> workQueue(等待任务存放的队列)。所以,这几个队列都无一例外的实现了BlockingQueue接口。   下面我们一一介绍下这几个队列。 一、ArrayBlockingQueue ...
在说核心内容之前,需要问一个问题,既然单个线程的创建和销毁都很简单,我们为什么要使用线程池? 使用池化技术是为了什么? 估计工作过很多年的老鸟们对这些东西都能说出个一二三来,无非就是以下几点: 1、线程 ...
一张图看懂UML的类图图示样例:      一、UML中类图符号解释 1.类(Class):使用三层矩形框表示。 第一层显示类的名称,如果是抽象类,则就用斜体显示。 第二层是字段和属性。 第三层是类的方法。 注意前面的符号,‘+’表示public,‘-’表示private,‘#’表示protected。我们的示意图中未列属性字段,因此画了两层. 2.接口:使用两层矩形框表示,与类图的区别主要是顶端有<<interface>>显示。 第一行是接口名称,第二行是接口方法。 接口还有一种表示方法,叫棒棒糖表示法,圆圈旁为接口名称:    3.泛 ...
Global site tag (gtag.js) - Google Analytics