自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(337)
  • 收藏
  • 关注

原创 负载均衡之一致性哈希算法

说到负载均衡的hash算法,自然会联想起如下这样的算法hash(object)%nodeTotal而在集群中,机器的动态上下线是常见的情况,如果集群是无状态的,那么上述的算法没有问题.但是如果是缓存之类的集群,节点的动态上下线会导致几乎所有的key的重新映射,这样造成的影响是数据错乱,相同备份的数据同时存在于集群中的多个节点,造成内存空间的浪费为了解决上述的问题,一致性哈希算法就被...

2018-03-21 21:12:05 4550 1

原创 负载均衡之轮询策略

轮询算法是最简单的一种负载均衡算法,它的原理是将用户的请求轮流分配给内部的服务器,并且轮询算法并不需要记录当前所有连接的状态,所以它是一种无状态的调度.简单轮询策略下面是简单轮询算法的实现public class RouteRound implements LoadBalance { private int count = 0; @Override p...

2018-03-19 21:26:14 5786

转载 WeakHashMap

WeakHashMap,此种Map的特点是,当除了自身有对key的引用外,此key没有其他引用那么此map会自动丢弃此值,见实例:此例子中声明了两个Map对象,一个是HashMap,一个是WeakHashMap,同时向两个map中放入a、b两个对象,当HashMap  remove掉a 并且将a、b都指向nu...

2018-03-09 10:34:24 539

转载 Reactor与Proactor模型

I/O模型在文章《unix网络编程》(12)五种I/O模型中提到了五种I/O模型,其中前四种:阻塞模型、非阻塞模型、信号驱动模型、I/O复用模型都是同步模型;还有一种是异步模型。Reactor模型        Reactor模式是处理并发I/O...

2018-03-06 17:05:19 597

原创 IdentityHashMap

在HashMap中,对于两个键值对key1-value1,key2-value2,在key相同(key1.equals(key2)==true)的情况下value1与value2不能共存,有没有一种数据结构使value1与value2共存呢?有,那就是IdentityHashMap.IdentityHashMap在比较键时候不是使用equals方法而是比较两个对象的引用,如果对象引用不同即使对象e...

2018-03-03 21:18:31 1262

转载 netty参数配置

通用参数说明 netty参数 说明 CONNECT_TIMEOUT_MILLIS 连接超时毫秒数,默认值30000毫秒即30秒。 MAX_MESSAGES_PER_READ 一次Loop读取的最大消息数,对于ServerChannel或者NioByteChannel,默认值为16,其他Channel默认值为1。默认值这样设置,是因为:ServerChann...

2018-02-25 23:26:11 3192

原创 Maven常用配置

1.统一项目字符集<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>2.dependency scope配置compile,缺省值,适用于所有阶段,会随着项目一起发布。 prov...

2018-02-12 22:43:45 455

转载 GC - 四种引用

Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference 这 4 种类型的引用与 GC 有着密切的关系, 让我们逐一来看它们的定义和使用场景 :1.Strong ReferenceStrongReference 是 Java 的默认引用实现, 它会尽可能长时间的存活...

2018-02-11 21:28:15 600

原创 guava - EventBus源码解析

订阅发布这种设计模式是一种最常见不过的设计模式.而EventBus是对Publisher和Subscriber的一种实现下面是EventBus的一个Demopublic class Event { /** * 事件总线使用该方法向监听者发送事件 * * @param message */ @Subscribe public...

2018-02-10 23:03:26 439

原创 观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某个主题对象,如果这个主题在状态上发生了变化,会通知所有的观察者对象,让他们自动更新自己观察者模式有如下四个角色 1. 被观察接口 2. 具体的被观察者 3. 观察者接口 4. 具体的观察者接口类图关系如下 原生观察者模式通过程序实例理解观察者模式被观察者接口包括注册观察者,移除观察者,通知观察者p...

2018-02-09 23:11:31 299

原创 Runtime

java的runtime类是一个封装了JVM进程的类,每一个java程序实际上都是启动了一个JVM进程.每一个程序都对应一个Runtime实例,实例是由JVM初始化的,我们可以利用java的Runtime类获取进程的相关信息,启动其它进程,关闭当前进程等操作实例化runtime类Runtime类在整个jvm中只存在一个Runtime对象,通过Runtime类的静态方法进行实例化操作而不...

2018-02-08 23:06:38 307

原创 避免NPE

在java开发中中NPE异常是常见异常,在阿里java开发手册中就明确强调防止NPE是调用者的责任是程序员基本修养,本篇博客讲解利用一些小技巧避免NPE1.1equals方法public void equals() { //代表未知的对象,可能会是NULL也可能不是NULL Object unKnowObject = null; //这样某些情况下可能会抛出

2018-02-06 22:35:22 5299 1

原创 EnumMap

EnumMap是Map接口的一种实现,专门用于枚举类型的键,所有枚举的键必须来自同一个枚举EnumMap不允许键为空,允许值为空EnumMap成员变量 private final Class keyType; private transient K[] keyUniverse; private transient Object[] vals; p

2018-02-05 22:40:46 1116

原创 java transient关键字

java对象在实现了Serilizable接口后这个对象就可以被序列化,但是java的这种序列化机制会将这个类的所有属性和方法都序列化.有时候我们的一些敏感信息比如密码并不想序列化传输给对方,这个时候transient关键字就派上用场了,如果一个类的变量加上了transient关键字那么这个字段就不会被序列化下面这个例子我们利用transient避免User序列化过程中密码字段的序列化

2018-02-04 22:23:50 458

原创 Builder内部类

今天在看当当网的开源项目分布式任务调度框架源码的时候,感到很奇怪,代码如下@AllArgsConstructor(access = AccessLevel.PRIVATE)public final class LiteJobConfiguration implements JobRootConfiguration { private final JobTypeConfigura

2018-01-17 19:53:50 1878

原创 idea 链式调用模板

#set($paramName = $helper.getParamName($field, $project)) #if($field.modifierStatic) static ## #end $class.name set$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifi

2018-01-17 18:52:42 1249

转载 Java ClassLoader机制

一、什么是ClassLoader?         大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程序的一个入口函数来调用系统的相关功能,而这些功能都被封装在不同的class文件当中,所以经常要从这个class文件中要调用另外一个class文件中的方法,如果另外一个文件不存在的,则

2018-01-07 18:22:58 294

转载 Fork Join框架

1.1 核心思想Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架,其实现思想与MapReduce有异曲同工之妙。Fork就是把一个大任务切分为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任务的结果。比如计算1+2+…+10000,可以分割成10个子任务,每个子任务分别

2018-01-06 20:44:33 527

原创 IOC - 方法注入

当有两个bean A,B.其中A的内部会调用B,A是单例的,而A每次调用到B的时候都需要重新实例化B,为了解决这个需求难道我们得放弃Spring容器?并不用,Spring可以通过方法注入来实现动态改变A内的BSpring的方法注入依赖于CGLIB,需要用到方法注入的方法必须满足以下声明规范public|protected> [abstract] return-type> theMeth

2018-01-06 15:12:38 420

转载 责任链模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(Chain of Responsibility)模式的:  责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责

2018-01-06 14:14:27 339

转载 Spring框架侵入性

摘自《Spring框架技术》Spring框架是一种非侵入式的轻量级框架1.非侵入式的技术体现允许在应用系统中自由选择和组装Spring框架的各个功能模块,并且不强制要求应用系统的类必须从Spring框架的系统API的某个类来继承或者实现某个接口。2.如何实现非侵入式的设计目标的 1)应用反射机制,通过动态调用的方式来提供各方面的功能,建立核心组间BeanFactory 2)配合使用Sp

2018-01-06 10:01:20 1764

原创 Spring-IOC容器之Bean的生命周期

Spring IOC容器以某种方式加载配置文件,然后根据这些信息绑定整个系统的对象,最终组装成一个可用的容器系统.Spring IOC容器实现这些功能可以将流程划分为两个阶段,分别为容器启动阶段和Bean实例化阶段.Spring在这两个阶段都加入了容器的扩展点以便我们根据场景的需要加入自定义的扩展逻辑容器启动阶段容器启动阶段任务加载配置分析配置信息装配到BeanDef

2018-01-05 20:32:24 566

转载 命令模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述命令(Command)模式的:  命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模式。  命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。命令模式的结构  命令模式是对命令的封装。命令模式把

2018-01-05 18:12:37 268

转载 状态模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述状态(State)模式的:  状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。  状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。状态模式的结构  用一句话来表述,状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象

2018-01-05 16:16:16 233

转载 深入理解AQS

一、什么是同步器多线程并发的执行,之间通过某种 共享 状态来同步,只有当状态满足 xxxx 条件,才能触发线程执行 xxxx 。这个共同的语义可以称之为同步器。可以认为以上所有的锁机制都可以基于同步器定制来实现的。而juc(java.util.concurrent)里的思想是 将这些场景抽象出来的语义通过统一的同步框架来支持。juc 里所有的这些锁机制都是基于 AQS ( AbstractQue

2018-01-05 10:22:39 574

转载 RESTful风格

REST – REpresentational State Transfer 直译:表现层状态转移。这个中文直译经常出现在很多文章中。尼玛,谁听得懂“表现层状态转移”,这是人话吗?那就逐个单词来理解REST名称 REST – REpresentational State Transfer 首先,之所以晦涩是因为前面主语被去掉了,全称是 Resource Representational St

2017-12-30 17:16:51 498

原创 策略模式

使用Lambda表达式实现策略模式看下面这个例子public class Asset { public enum AssetType { BOND, STOCK }; private final AssetType type; private final int value; public Asset(final AssetType assetType, final

2017-12-28 08:40:44 358

转载 平衡二叉树

上一篇我们聊过,二叉查找树不是严格的O(logN),导致了在真实场景中没有用武之地,谁也不愿意有O(N)的情况发生,作为一名码农,肯定会希望能把“范围查找”做到地球人都不能优化的地步。     当有很多数据灌到我的树中时,我肯定会希望最好是以“完全二叉树”的形式展现,这样我才能做到“查找”是严格的O(logN),比如把这种”树“调正到如下结构。     这里就涉及到了“树节点”的旋转,也是

2017-12-27 21:34:56 493

原创 java8 - 排序

java8以前在java以前为了对集合排序,通常的做法是这样的bean如下private static class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name;

2017-12-20 21:05:23 1238 1

原创 java8 - Lambda集合操作

遍历集合在java8之前的版本中遍历一个集合常用下面这两种方法private static void list() { for (int i = 0; i < fruits.size(); i++) { System.out.println(fruits.get(i)); }}private static void list1() { for (String

2017-12-20 19:16:41 4419 1

原创 java8 - fork-join之CompletableFuture 使用总结

CompletableFuture类实现了CompletionStage和Future接口。Future是Java 5添加的类,用来描述一个异步计算的结果,但是获取一个结果时方法较少,要么通过轮询isDone,确认完成后,调用get()获取值,要么调用get()设置一个超时时间。但是这个get()方法会阻塞住调用线程,这种阻塞的方式显然和我们的异步编程的初衷相违背。 为了解决这个问题,JDK吸收了

2017-12-20 19:00:03 2787

转载 git安装和使用

1.首先介绍一下什么是Git和GitHub Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理。在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中。目前,包括Rubinius和Merb在内的很多知名项目都使用了Git。 GitHub基于Rails的Git库托管 如前所述,作为一个分布式的版本控制系统,在Git中

2017-12-19 21:01:51 324

原创 尾递归

递归对于下面这个递归求阶乘调用private static long factorialRecursive(long n) { return n == 1 ? 1 : n * factorialRecursive(n - 1);}factorialRecursive调用在运行的时候每次执行factorialRecursive方法调用都会在调用栈上创建一个新的栈帧,用于保存每个方法调用的状态

2017-12-19 14:45:13 351

转载 优先级队列

优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。  PriorityQueue是从JDK1.5开始提供的新的数据结构接口。  如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列。       由于网上的资料大多将优先级队列各个方法属性,很少有实例讲解的,为方便大家以后使用,我就写了个de

2017-12-16 21:43:07 307

转载 Guava篇-缓存

范例LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() .maximumSize(1000) .expireAfterWrite(10, TimeUnit.MINUTES) .removalListener(MY_LISTENER) .build(

2017-12-16 21:41:33 437

转载 HashSet 的实现原理

HashSet 概述 对于 HashSet 而言,它是基于 HashMap 实现的,底层采用 HashMap 来保存元素,所以如果对 HashMap 比较熟悉了,那么学习 HashSet 也是很轻松的。我们先通过 HashSet 最简单的构造函数和几个成员变量来看一下,证明咱们上边说的,其底层是 HashMap:private transient HashMap<E,Object> map;

2017-12-16 18:39:20 465

原创 java8 - 字符串操作

1.java-8新特性 String-Join操作1.字符串之间分隔符StringJoiner sj=new StringJoiner(","); sj.add("aaa"); sj.add("bbb"); sj.add("ccc"); System.out.println(sj.toString());运行结果aaa,bbb,ccc2

2017-12-15 19:00:52 2058

原创 ThreadGroup解读

ThreadGroup是位于java.lang包下的一个类,用于统一的线程管理.一旦一个线程加入到一个线程组后,就不能更换线程所在的线程组将当前线程加入到线程组中Thread thread = new Thread(threadGroup, new MyThread(), "threadname-" + i);通过重写uncaughtException方法捕获异常ThreadGroup thread

2017-12-15 12:10:08 1993

转载 Java SPI机制

SPI的全称是Service Provider Interface。简单来说,SPI机制提供了一个表达接口和其具体实现类之间的绑定关系的方案。具体是在JAR包的"META-INF/services/"目录下建立一个文件,文件名是接口的全限定名,文件的内容可以有多行,每行都是该接口对应的具体实现类的全限定名。

2017-12-12 20:48:04 282

原创 java8 Stream简述

Stream是java 8的新特性,Stream是对集合功能的增强Stream不是集合元素它不是数据结构,不能用于保存数据,它是有关于算法和计算的Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。和迭代器又不同的是,Stream 可以并行化操作,迭代器只能命令式地、串行化操作。顾名思义,当使用串行方式去遍历时

2017-12-12 14:35:51 489

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除