- 博客(90)
- 收藏
- 关注
转载 一致性哈希算法
算法应用这是一种路由算法,适用于大部分的路由场景,优点是在伸缩性需求较高的场景中可以提高命中率。算法思路先构造一个长度为2的32次方的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[-2^31, 2^31))将缓存服务器节点放置在这个Hash环上,然后根据需要缓存的数据的Key值计算得到其Hash值(其分布也为[-2^31, 2^31)),然后在Hash...
2018-03-19 13:28:00
148
转载 装饰模式
装饰模式可以在不创造更多子类的情况下讲对象的功能加以扩展角色抽象构建角色:一个接口或抽象类,规范准备接受附加责任的对象(即具体构建角色)具体构建角色: 具体的,可以被装饰装饰角色:持有一个抽检构建的引用,已原逻辑实现抽闲构建角色的方法。具体装饰角色:可以装饰构建角色,也可以被装饰UML类图装饰角色持有构建角色引用,而且装饰角色中的方法和构建角色中的想用,实现方法使用构...
2018-03-08 11:24:00
147
转载 观察者模式
角色被观察者:被观察者持有一组对抽象观察者的引用抽象观察者:一个接口,封装事件方法具体观察者:实现抽象观察者接口,被观察者可以绑定观察者、取消绑定。UML类图当被观察者状态改变时,notify()方法要被调用,在该方法中调用observers类表中每一个observer的方法。代码示例没错!下面这两个类(接口)分别是JDK1.8中的java.util.Observa...
2018-03-07 13:53:00
133
转载 代理模式
静态代理角色公共接口:封装了需要被代理的方法真实对象:被代理方代理对象:代理方UML类图代理对象持有对真实对象的引用,并且是一种一一对应的引用,此二者都实现公共接口(即实现需要被代理的方法),代理对象可以自行决定被代理对象的方法以何种方式执行、以及执行前后分别还需执行何种逻辑。例子代码公共接口:public interface Subject { ...
2018-03-07 13:52:00
106
转载 策略模式
角色抽象策略策略的一个抽象,通常是一个函数式接口。具体策略实现抽象策略的类的实例,匿名内部类的对象较为常见。策略使用者该使用者实例应该持有一个抽象策略引用作为成员,以便调用策略中的方法。UML通常的用法是创建Environment类同时使用匿名内部类初始化strategy引用,然后调用Environment中的方法,这些方法中会调用Strategy的实现类实例的方法...
2018-03-07 13:51:00
72
转载 单例模式
代码public class Singleton { private static volatile Singleton singleton; private Singleton(){} public static Singleton getInstance(){ if(null == singleton){ sync...
2018-03-07 13:50:00
71
转载 springboot官方文档引注 2.0.0.M7
Part 1 (1-7)对Spring Boot 的简短介绍,提供整个文档的一份快速阅读的地图,使用起来方便查找Part 2 (8-12)开始使用8 一些好处的介绍9 环境要求9.1 内嵌web容器版本10 安装手册10.1 java开发者的安装手册10.1.1 Maven安装模板10.1.2 Gradle 安装模板10.2 使用springboot C...
2018-03-07 13:49:00
227
转载 gradle学习之旅(十二) 本地依赖缓存与解决依赖问题
本地缓存的结构本地缓存中用来存储依赖的Gradle根目录是<USER_HOME>/.gradle/caches缓存实际上被分为两个部分,包括从仓库下载的原始二进制文件和已下载工件的元数据gradle缓存特性gradle会将依赖工件的来源存储在缓存中,当仓库中的结构发生变化,会自动调整,使得新的构建更可靠工件变化检测,项目依赖元数据被存储在缓存中,避免每次运行构...
2017-12-15 17:55:00
952
转载 gradle学习之旅(十一) 使用和配置仓库
仓库gradle对现有仓库支持如下Maven 仓库本地文件系统或远程服务器中的Maven仓库,或者预配置的Maven CentralIvy 仓库本地文件系统或远程服务器中的Ivy仓库,具有特定的结构模式扁平的目录仓库本地文件系统的仓库或者远程目录仓库,没有元数据支持仓库API项目中定义仓库的关键是Repositoryhandler接口,它提供了添加各种类型仓库的...
2017-12-15 15:09:00
138
转载 gradle学习之旅(十) 依赖声明
gradle项目的依赖类型依赖API上图是项目、依赖处理器、依赖 的类图表示gradle项目有一个DependencyHandler实例,通过getDependencies()方法来取得引用。声明依赖需要通过dependencies配置块中的依赖处理器方法来声明每个依赖都是一个Dependency类型的一个实例,group、name、version、classifier属...
2017-12-15 14:05:00
262
转载 gradle学习之旅(九) 依赖配置
包括本节的接下来三节中分别学习gradle依赖管理中是三个重要感念:依赖配置、依赖声明、仓库配置和使用什么是配置配置就是依赖的配置插件可以引入配置来定义依赖的作用域(第四节的java插件),比如java插件通过compile配置添加编译产品源代码所需的依赖。配置的API表示配置可以直接在项目的根级别添加和访问,可以直接使用插件提供的配置,也可以声明自己的配置。类似于ta...
2017-12-15 10:54:00
127
转载 gradle学习之旅(八) 开始学习依赖管理
依赖管理概述自动化的依赖管理,目的是通过使用声明项目所需顶层依赖的方式,来解决本项目对外部类库的依赖问题,顶层依赖所需要的传递性依赖可以交由依赖管理器自动处理,也可以编写脚本实现特殊的要求。类库的常见存在,java类库通常以JAR文件的形式存在,JAR文件规范不要求指定版本,但是一般的做法都会将版本号附加到JAR文件名上来表示一个特定的发布版本(比如,spring-web-3.1....
2017-12-13 15:37:00
69
转载 gradle学习之旅(七) 挂接到构建生命周期
gradle提供了构建生命周期的钩子来支持执行构建生命周期中某事件发生时想要执行的代码。一个生命周期事件可能发生在某个构建阶段之前、期间或者之后。在执行阶段之后发生的生命周期事件是构建的完成。有两种方式可以编写回调生命周期事件:将代码写在闭包中实现Gradle API所提供的监听器接口具体Gradle提供了哪些钩子可以通过官方文档API查看,下面使用与task执行图有关的钩子来...
2017-11-27 16:39:00
122
转载 gradle学习之旅(六) 使用task(下)
增量式构建gradle判断task是否改变过的依据是:这个task的inputs和outputs属性组成的集合。当一个task链被执行时,如果其中某一个task的inputs和outputs没有发生改变,则认为该task是最新的,该task将被跳过,在执行链输出中可以看到该task被标为UP-TO-DATE,下图为Task中的imputs和outputs属性inputs 属性应该...
2017-11-27 08:00:00
219
转载 gradle学习之旅(六) 使用Task(上)
本节以软件项目的版本管理作为例子来学习gradle的task的使用gradle构建生命周期想要理解task的使用方法,理解gradle'build lifecycle phases(gradle构建生命周期各阶段)是至关重要的,无论什么时候执行gradle构建,都会运行三个不同的生命周期:如下初始化阶段(Initialization phase)这个阶段,gradle在内存中为...
2017-11-24 15:26:00
187
转载 gradle学习之旅(五) gradle构建块
发现一个讲解gradle的博客,在此做一下记录并推荐出来:Gradle学习系列在之前的博客中,对gradle的基本用法做了简单的了解,并使用gradle的核心插件构建了一个完整的javaweb项目,如果只是使用插件的默认约定,采用插件提供的标准构建,和使用插件提供的标准task,那么已经可以在新的项目中大胆使用gradle了。但是如果想要发挥gradle的各种优势,灵活的使用gra...
2017-11-21 15:48:00
130
转载 gradle学习之旅(四) 使用gradle构建简单的java web项目
本节通过一个简单的javaweb项目来体会gradle的使用需求构建一个javaweb项目,搭建jsp+servlet开发环境可以将需求分解为两步:使用gradle构建一个java项目为该项目构建web视图层工具gradle4.3ideajdk 1.8实验过程首先在idea中创建一个空的gradle项目创建如下目录-文件结构这里需要特别说明,下面的目...
2017-11-20 15:52:00
148
转载 gradle学习之旅(三) 命令行工具
Gradle CLI 介绍Gradle 命令行工具用法:Gradle [Option...] [Tasks...]可以看出Gradle CLI就是告诉Gradle如何执行预定义的任务的工具,是面向Task的界面。其中Task大体上分为两种:1.探索类Task,即帮助Task;2.构建设置Task,这种Task完成构建的预设置;3.构建Task,完成构建的Task;opt...
2017-11-20 15:13:00
120
转载 gradle学习之旅(二) gradle安装、构建脚本初识
一、安装官网下载地址二、构建脚本 构建脚本名字默认为build.gradle,可以以指定脚本来完成构建。 gradle的构建脚本使用Groovy脚本语言的DSL,其中使用了大量的语言特性来使得脚本的编写“看起来”像是在描述构建,实际上构建脚本的语言仍然是最基本的面向对象的Groovy或java代码,下面将详细说明Gradle构建脚本中使用到的Groovy与语言特性。...
2017-11-17 00:41:00
90
转载 gradle学习之旅(一) 新起点
一、为什么要学习gradle由于gradle在项目编译、测试、打包、部署、依赖管理等各方面都有很细的粒度,有助于完整了解一个项目从无到有,再到可以发布的完整的过程,而且gradle的的默认语言为groovy,groovy又是基于java的一种脚本语言,作为java程序员来讲,学习gradle的曲线不会特别陡峭。学习groovy+gradle既可以锻炼自己函数式编程能力和编写脚本的能力,...
2017-11-14 13:17:00
88
转载 java核心学习(四十一) 反射和泛型
JDK5以后,Class类增加了泛型功能,从而允许使用泛型来限制Class类,例如String.class的类型是Class<String>,如果Class对应的类暂时未知,则使用Class<?>。通过反射中使用泛型,可以避免使用反射生成的对象需要强制转换类型。 java对于类型的抽象,有两个类:Type、ParameterizedType ,第一个类单...
2017-10-31 23:47:00
79
转载 java核心学习(四十) 使用反射生成JDK动态代理
java.lang.reflect包下提供了一个Proxy类和InvocationHandler接口,用于生成动态代理类和动态代理对象。一、使用Proxy、InvocationHandler创建动态代理 这里要注意,在java.net包下也有一个Proxy类,不过这个类是用于设置代理服务器的,莫混淆。。 Proxy提供了如下两个方法创建动态代理类和动态代理实例: ...
2017-10-31 23:23:00
233
转载 java核心学习(三十九) 通过反射生成并操作对象
一、创建对象 通过反射创建对象有两种方式: 1、 使用Class对象的newInstance()方法,这种方法实际上是使用默认的构造器起来创建该类的实例 2、使用Class对象获取指定的Constructor对象,调用Constructor对象的newInstance()方法来获取来创建该Class的实例,这样可以根据参数类型来指定使用哪个构造器。 下面代...
2017-10-31 16:31:00
142
转载 java核心学习(三十八) 通过反射查看类信息
反射实现了java代码对java代码的操作。一、获得Class对象 有下列四种方式: 使用Class类的forName(String className) 静态方法,该静态方法需要传入类的全限定名称字符串。 调用某个类的class属性来获得该类对应的class对象。 调用某个对象的getClass()方法。 调用ClassLoad...
2017-10-31 10:52:00
82
转载 java核心学习(三十七) 类加载器
类加载器负责将.class文件(可能在磁盘上,也可能在网络上)加载到内存中,并为之生成对应的java.lang.class对象。一、类加载器简介 一旦某个类被类加载器载如内存中生成一个java.lang.class实例,同一个类便不会再被载入。 类的唯一标识:再java语言中,一个类用其全限定名做唯一标识,但是在JVM中,一个类用其全限定名和它的类加器作为唯一标识...
2017-10-29 21:39:00
67
转载 java核心学习(三十六) 类加载和初始化
在我们运行了java程序之后,我们所运行的.class文件会加载、连接、初始化三个步骤,这三个步骤中,加载与连接都由JVM来实现,程序员对此无感知,初始化过程则根据我们写的类定义来实现。一、JVM和类 当使用java命令运行某个java程序时,该命令会启动一个运行在JVM上的进程,该JVM进程被中止的情形为: 程序运行到最后正常结束; 程序调用Sys...
2017-10-27 00:27:00
75
转载 java核心学习(三十五) 网络编程---代理服务器
一、代理服务器的功能 1、突破自身IP限制,对外隐藏自身IP地址,访问受限站点。 2、提高访问速度,代理服务器相当于一层缓存。二、直接使用Proxy创建连接 Proxy有一个构造器为:Proxy(Proxy.Type type,SocketAddress sa),用于创建表示代理服务器的Proxy对象,其中sa参数指定代理服务器的地址,type代表该代理服务器...
2017-10-26 21:35:00
146
转载 java核心学习(三十四) 网络编程---java对UDP协议的支持
TCP 协议在两端的Socket之间虚拟了一条链路,UDP协议则没有这么麻烦,两端的Socket只是发送、接收数据报的对象,所以UDP服务器没有并发机制,只需要建立一个数据输入队列就可以。UDP协议数据报传输大小限制在64KB下。一、DatagramSocket、DatagramPacket 用法如下://接收数据byte[] buffer = new byte...
2017-10-23 00:12:00
99
转载 java核心学习(三十三) 网络编程---AIO实现异步Socket通信
AIO需要操作系统的支持,在linux内核2.6版本中加入了对真正异步IO的支持,java从jdk1.7开始支持AIO核心类有AsynchronousSocketChannel 、AsynchronousServerSocketChannel、AsynchronousChannelGroup 前两个个类是javaAIO为TCP通信提供的异步Channel。看名字就知道应该是...
2017-10-20 11:08:00
397
转载 java核心学习(三十二) 网络编程---五种IO方式以及select以及epoll方法的理解
所谓IO,就是内存读写的问题,只不过读写的目标不同,可能向磁盘读写,也可能向远程计算机读写,而在linux系统中,所有的外设都可以抽象为文件,所以在linux中IO问题等同于磁盘文件IO。在计算机中,用户态程序只能访问自己的内存区域,如若想访问磁盘文件内容必须通过操作系统为应用程序提供的统一接口:系统调用。所以真正的从磁盘中读取数据或写入数据的过程是由操作系统内核完成的,用户程序仅仅...
2017-10-19 23:33:00
138
转载 java核心学习 (三十一) 网络编程---使用NIO实现非阻塞Socket通信
java1.4开始,提供NIO的API来开发高性能网络服务器,前面介绍的IO方式均为BIO,即阻塞式IO。阻塞式IO在IO操作发起后直到IO操作结果返回这段时间,会一直阻塞该线程,所以基于BIO的网络服务器必须为每个客户端都提供一个独立线程进行处理,否则将会产生很大的延迟。但是当客户端请求并发数量很大时,直接采用BIO方式会产生大量的线程,会导致服务器性能下降。而使用NIO API可...
2017-10-19 20:41:00
147
转载 java核心学习(三十) 网络编程---java对tcp的基本支持
一、ServerSocket类 ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一直处于等待状态,在新建这个类的时候可以指定监听的端口。 Socket accept() 调用ServerSocket对象的accept()方法,可以返回监听到的Socket对象。 使用以下代码可以通过循环不断调用accept()方法。Server...
2017-10-16 22:43:00
158
转载 java核心学习(二十九) 基本网络支持
一、InetAddress java提供了InetAddress代表IP地址,它有两个子类Inet4Address和Inet6Address,分别代表了IPV4和IPV6地址。 这个类没有构造器,而是使用两个静态工厂方法来获得InetAddress实例 getByName(String host); getByAddress(byte[] addr); ...
2017-10-16 21:55:00
79
转载 java核心学习(二十八) 网络编程 网络工作方式简述
程序员可以由java提供的一些用于网络编程的API和工具类可以实现对TCP/IP网络的各种编程,利用TCP/IP传输信息,从而实现主要的四个功能: 资源共享; 信息集中处理; 均衡负荷与分布处理; 综合信息服务; 本文对以下几个问题进行简述,来解释计算机网络宏观上的工作方式。 程序员编写java代码使用jav...
2017-10-16 21:44:00
71
转载 java核心学习(二十七) 多线程---线程相关类
一、ThreadLocal类 变量类型可以被声明为ThreadLocal<T>,作用是在并发处理该变量时会为每一个使用该变量的线程都提供一个该变量的副本 该类提供了三个方法: T get(): 返回此线程局部变量中当前线程的值。 void remove(): 删除此线程局部变量中当前变量的值 void set(T value): ...
2017-10-09 10:36:00
97
转载 java核心学习(二十六) 多线程---线程池
一、线程池适用场景 线程池技术适用于处理并发的大量短连接请求,可以免去线程创建和销毁时损耗的系统资源,这也是所有“池”的目的。开发者可以实现满足自己需求的线程池,在本节结尾处作者会分享一个简单线程池的实现来一起深入学习线程池。二、java內建线程池 从java5开始,新增了一个Executors工厂类来产生线程池(所谓工厂类就是不同与使用new 构造器 这种方式新建对象,...
2017-09-26 17:09:00
91
转载 java核心学习(二十五) 多线程---线程组和未处理的异常
一、java对线程组的支持 Java使用ThreadGroup类来代表线程组,对线程组的控制相当于同时控制这组线程。 在使用Thread的构造方法创建线程时可以指定线程组,Thread类提供了指定线程组的重载构造器,但在创建完成之后就不能改变线程的线程组。若不显示传入一个ThreadGroup对象作为构造器参数,则默认子线程与父线程同组。 Thread类中有一个实例...
2017-09-26 08:36:00
82
转载 java核心学习(二十四) 多线程---线程通信
一、传统线程通信方式 Object类提供了三个方法:wait()、notify()、notifyAll() 这三个方法必须由同步监视器对象来调用 wait():导致当前线程等待,使用wait方法会导致当前线程释放对同步监视器的锁定,直到其他线程调用该同步监视器的notify()方法或notifyAll()方法来唤醒该线程。 notify():唤醒在此同步监视器上等...
2017-09-25 17:21:00
86
转载 java核心学习(二十三) 多线程---线程同步
一、线程安全问题 线程安全问题是由于代码在执行中的非原子性导致的。如果不能在程序上对线程访问临界区做出控制,则会“偶然出错”。二、同步代码块 同步监视器,实际上就是要访问的临界区,这个临界区是一个对象,下面代码obj就是同步监视器,在执行下面的代码时,会先获取obj的对象锁,如果该锁已经被其他线程占用,则当前线程阻塞。取得了对象锁之后就可以执行同步代码块里的代码,相当于P...
2017-09-23 16:03:00
108
转载 java核心学习(二十二) 多线程---线程控制
java的线程支持提供了一些便捷的工具方法,可以用来控制线程的执行一、join线程 当前线程可在执行体里面调用其他线程的join方法,调用后当前线程阻塞,直到被join()方法加入的join线程执行完为止。 join方法通常由使用线程的程序调用,将大问题划分成许多小问题,每个小问题分配一个线程,当所有小问题都得到处理后,再调用主线程来进一步操作。 下面试一下...
2017-09-22 13:58:00
69
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人