自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

elricboa的专栏

少说多做

  • 博客(110)
  • 资源 (1)
  • 收藏
  • 关注

原创 通过tiny-spring学习Spring框架IOC源码(四)

这篇文章继续跟随tiny-spring的思路体会Spring框架中IOC中的经典设计,第五步主要将Xml中配置的Bean解析后注入到Bean实例中后,引入了BeanReference,并getBean时候判断没有bean的时候创建新的实例,第六步是使用ApplicationContext将BeanFactory作为属性后,后续可以使用组合的方式对bean的功能进行增强和扩展。一、BeanRef

2018-02-12 11:29:04 676

原创 Netty服务端启动过程源码解析

Netty服务端创建时序图创建ServerBootstrap实例ServerBootstrap是一个用于启动Netty服务端的辅助类,提供一系列方法设置启动参数。因为ServerBootstrap需要设置的各项信息很多,所以这里采用builder模式实现。设置并绑定Reactor线程池通过构造函数创建ServerBootstrap实例之后,通常会创建两个EventLoopG

2018-01-17 11:15:27 632

原创 Netty介绍

介绍Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.Netty is a NIO client server framework

2018-01-11 18:54:19 831

原创 java网络编程几种IO模型的介绍和对比

本文通过实现一个简单的时间服务器和客户端,分别对JDK的BIO、NIO和JDK1.7中的NIO 2.0的使用进行介绍和对比,了解基于java的网络编程的发展。本文内容主要参考《Netty权威指南》。BIOBIO即同步阻塞IO,采用BIO通信方式的服务器,对于每一个连接请求都由服务器创建一个新的线层来接受和处理请求,处理完成后销毁线程。这就是典型的一请求一应答的模型。

2018-01-11 15:18:05 2894

原创 机器学习初探-常用优化算法介绍

目的:简单介绍机器学习中常用的一些优化算法,主要用于无约束最优化问题的求解。具体包括梯度下降法(最速梯度下降),牛顿法,几个拟牛顿法(包括DFP,BFGS,LBFGS等,共轭方向法,共轭梯度法,信赖域方法等不在本次做讨论)。概述一般的有监督的机器学习问题中,有了带有标注的数据之后,我们往往会先假设一个模型(比如在二分类问题中,我们可以假设有一个超平面把不同类别的ca

2018-01-10 11:31:31 2250

原创 【Java并发学习】深入浅出AbstractQueuedSynchronizer

1 从ReentrantLock说起        Java从语言级别支持多线程,用户可以很容易的编写多线程的程序。需要注意的是,当多个线程访问共享资源时,为了保证数据的正确性,需要进行同步。Java提供了synchronized关键字(内置锁),synchronized块和synchronized方法可以用来进行同步。与此同时,java.util.concurrent包中还提供了Reen

2017-12-20 21:36:16 331

原创 Netty实现原理浅析

1. Netty简介Netty是一个高性能、异步事件驱动的NIO框架,基于JAVA NIO提供的API实现。它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。 作为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏

2017-12-20 20:43:44 1147

原创 NIO的使用总结

背景传统流I/O是基于字节的,所有I/O都被视为单个字节的移动;而NIO是基于块的,大家可能猜到了,NIO的性能肯定优于流I/O。没错!其性能的提高 要得益于其使用的结构更接近操作系统执行I/O的方式:通道和缓冲器。我们可以把它想象成一个煤矿,通道是一个包含煤层(数据)的矿藏,而缓冲器则是派送 到矿藏的卡车。卡车载满煤炭而归,我们再从卡车上获得煤炭。也就是说,我们并没有直接和通道交

2017-12-20 20:38:01 243

原创 【Java多线程学习】ScheduledThreadPoolExecutor源码解读

背景Timer的优点在于简单易用,但是由于所有的任务都是由同一个线程来调度,因此所有的任务都是串行执行的,同一时间只能有一个任务在执行,在前一个任务的延时都会影响到之后的任务。同时,Timer不会捕获TimerTask的异常,只是简单的停止,这样也肯定会影响到之后任务的执行。当然可以为了完成多线程适应多个Timer,只是这些Timer需要自己来管理,而不是一个框架体系。鉴于

2017-12-20 19:49:37 485

原创 PriorityQueue原理解读

PriorityQueue优先队列本质上就是一个最小堆。所以先讲讲堆的性质:堆     堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别为大顶堆和小顶堆)。需要注意的是堆中任一子树也是堆。下图中给出了从二叉树角度来看的大顶堆。         如果从数组角度来看,那么该大顶堆如下:     按照编号来

2017-12-20 18:11:11 660

原创 FIFO和LFU算法介绍

FIFO:First In First Out,先进先出。判断被存储的时间,离目前最远的数据优先被淘汰。LRU:Least Recently Used,最近最少使用。判断最近被使用的时间,目前最远的数据优先被淘汰。LFU:Least Frequently Used,最不经常使用。在一段时间内,数据被使用次数最少的,优先被淘汰。FIFO原理:按照“先进先出(First I

2017-12-20 17:45:24 1269

原创 网络I/O模型知识总结

在实际应用中,数据操作通常分为输入和输出,那么以输入为例,在操作系统中,一个数据的输入通常分为以下两个过程:等待数据准备好.将准备好的数据从内核拷贝到用户空间     下面我们将会分别讨论 I/O 模型中的两个大类,即 同步 I/O 与 异步 I/O。      图 1. 基本I/O 模型的简单矩阵同步阻塞I/O    

2017-12-20 16:36:32 334

原创 磁盘IO的相关知识

1. 背景     计算机硬件性能在过去十年间的发展普遍遵循摩尔定律,通用计算机的CPU主频早已超过3GHz,内存也进入了普及DDR4的时代。但是传统硬盘虽然在存储容量上增长迅速,在读写性能上并无明显提升,同时SSD硬盘价格高昂,不能在短时间内完全替代传统硬盘。传统磁盘的IO读写速度成为了计算机系统性能提高的瓶颈,制约了计算机整体性能的发展。     硬盘性能的制约因素是什么?如何根据

2017-12-20 15:51:37 3796 1

原创 Guava Cache介绍

背景项目中需要使用到很多个DataSource,就想着用一个LRU的算法来进行缓存。刚开始自己用LinkedHashMap,synchronized关键字实现了一个LRU的缓存类。但是被老大鄙视了,说还是google大法好,而且效率肯定也比我的高。好吧,所以就去学习了一个guava Cache的使用。本篇文章主要是参考的是官方文档,有兴趣的同学可以自行去阅读。Gua

2017-12-19 21:13:50 1103

原创 LRU算法四种实现方式介绍

LRU全称是Least Recently Used,即最近最久未使用的意思。LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。实现LRU     1.用一个数组来存储数据,给每一个数据项标记一个访问时间戳,每次插入新数据项的时候,先把数组中存

2017-12-19 20:58:58 204168 12

原创 【Java集合框架源码】LinkedHashMap剖析

简介LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。HashMap与LinkedHashMapLinkedHashMap 实现与 HashMap 的不同之处在于,LinkedHashMap 维护着一个运行于所有条目的双

2017-12-19 15:26:33 283

原创 【Java设计模式学习】适配器模式

1.适配器模式的定义适配器模式定义:将一个类的接口,转化成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。简单的来说就是把不符合要求的类,通过实现期望的接口来来达到以假乱真的效果。上个图来直观地理解一下~再联想一下生活中的例子,插座转换器、网线转换器……2.适配器模式种类适配器模式包括两种:类适配器模式——使

2017-12-19 14:29:04 251

原创 【Mybatis学习】增强型注解简化SQL

1. 背景MyBatis提供了简单的Java注解,使得我们可以不配置XML格式的Mapper文件,也能方便的编写简单的数据库操作代码:public interface UserMapper { @Select("SELECT * FROM users WHERE id = #{userId}") User getUser(@Param("userId") String

2017-12-19 12:42:40 536

原创 【Mybatis学习】注解方式使用讲解

MyBatis注解MyBatis可以利用SQL映射文件来配置,也可以利用Annotation来设置。MyBatis提供的一些基本注解如下表所示。注解目标相应的XML描述@CacheNamespace类  为给定的命名

2017-12-19 11:36:53 2047

原创 【Java多线程】ThreadPoolExecutor线程池讲解

背景如果我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的

2017-12-19 10:52:09 1748

原创 【Java多线程】CountDownLatch、CyclicBarrier和Semaphore使用

1.CountDownLatch的用法CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕后才能执行,此时就可以利用CountDownLatch来实现这种功能了CountDownLatch类只提供了一个构造器:public CountDownLatch(int coun

2017-12-18 22:14:15 196

原创 【Java多线程】Callable、Future与FutureTask的使用

背景java中有两个创建线程的方式,一种是直接继承Thread,另外一种就是实现Runnable接口。这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。而自从Java 1.5开始,就提供了Callable和Future,通

2017-12-18 22:01:35 176

原创 【Java多线程】之ThreadLocal分析

1.对ThreadLocal的理解ThreadLocal,也叫线程本地变量或线程本地存储。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。我们先来看一个例子:class ConnectionManager { private static Connection connect = null;

2017-12-18 21:10:17 222

原创 Spring事务管理学习

1.背景Spring提供了编程式事务和声明式事务,但由于编程性事务的侵入性,开发中普遍会使用Spring的声明式事务,下文中所说的Spring事务也都是指声明式事务。Spring声明式事务底层是建立在AOP的基础上的,其本质就是对方法前后进行拦截,然后在目标方法之前创建或加入一个事务,在执行完目标方法之后根据执行执行情况提交或回滚事务。声明式事务最大的优点就是不需要在业务逻

2017-12-18 20:54:56 234

原创 RPC原理介绍

面向服务架构SOA任何大型网站的发展都伴随着网站架构的演进。网站架构一般最初是单应用设计,然后逐渐经历面向对象设计和模块化设计的架构,最终发展到面向服务的服务化架构。在单应用设计架构体系当中,我们关注的是方法和实体;而在面向服务的服务化架构中,我们则关注的是服务和API。网站架构演进图如下图所示:传统应用开发中会面临研发成本高,运维效率低等挑战。研发成本高主要体现在

2017-12-18 19:52:56 12472 3

原创 【Mybatis学习】查询映射过程解析

1.功能架构Mybatis的功能架构分为三层:(1)API接口层:提供给外部使用的接口API,比如dao层接口。(2)数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。(3)基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理、日志,这些都是共

2017-12-10 15:53:13 1734

原创 【MyBatis学习】使用讲解

MyBatis是一个轻量级的ORM框架,它简化了对关系数据库的使用,开发人员可以在XML或注解中编写SQL来完成对数据库的操作,配置与使用简单,由于是手动写SQL,可控性好,便于SQL调优,而且如果完全使用XML方式,SQL语句可以集中维护,可以做到与Java代码完全隔离,也便于有DBA的团队对SQL调优。MyBatis的大版本号是3.x,它的前身叫iBatis,创建于2002,最后一个版

2017-12-10 15:28:39 336

转载 分布式系统的事务处理几种常见方法

看到耗子叔这篇对于分布式事务处理的几种方式写的很清晰,原文:https://coolshell.cn/articles/10910.html当我们在生产线上用一台服务器来提供数据服务的时候,我会遇到如下的两个问题:1)一台服务器的性能不足以提供足够的能力服务于所有的网络请求。2)我们总是害怕我们的这台服务器停机,造成服务不可用或是数据丢失。于是我们不得不对我们的服务

2017-12-10 14:33:23 12562

转载 Java集合的精华总结

在尽可能短的篇幅里,将所有集合与并发集合的特征、实现方式、性能捋一遍。适合所有"精通Java",其实还不那么自信的人阅读。 期望能不止用于面试时,平时选择数据结构,也能考虑一下其成本与效率,不要看着API合适就用了。 1.List 1.1 ArrayList以数组实现。节约空间,但数组有容量限制。超出限制时会增加50%容量,用System.a

2017-12-10 14:23:22 210

转载 JVM启动参数推荐

在关键的业务系统里,除了继续追求技术人员最爱的高吞吐与低延时之外,系统的稳定性与出现问题时排查的便捷性也很重要。看到白衣16年的这篇文章总结的很全面,转载学习下,原文:《关键业务系统的JVM启动参数推荐》http://calvin1978.blogcn.com/articles/jvmoption-2.html 前言1,资料学习开源项目的启动脚本是个不错的主意,比如Cass

2017-12-10 14:20:48 533

原创 一次线上服务fullGC原因排查

一、现象早上九点多又收到了fullGC次数过高的应用监控告警{P1}{故障}JVM Old GC all(#3) full_gc_count  >5}{当前值:28},通过公司使用的监控平台可以观察到服务器在这个时间段内确实出现了一些异常情况:1.负载突然增加2.fullgc频率显著增加,每次时间渐渐增长3.老年代内存使用率增长很快(大量对象直接进入老年带),可

2017-12-09 21:39:46 4233

原创 分布式一致性算法-paxos介绍

概述Paxos算法是Lamport创造基于消息传递的一致性算法,包括Google的Chubby在内很多系统都应用了Paxos算法,Google Chubby[1]有下面的描述:all working protocols for asynchronous consensus we have so far encountered have Paxos at thei

2017-12-09 21:10:11 3791

原创 groovy脚本导致FullGC问题排查

背景: 应用中内嵌了groovy引擎,会动态执行传入的表达式并返回执行结果 线上问题:发现机器的fullGC从某个时候开始暴涨,并且一直持续;登到机器上,用jstat -gcutil 命令观察,发现perm区一直是100%,fullGC无法回收;将这台机器的内存dump出来进行分析;在类视图中,发现大量的groovy.lang.GroovyClassLoader$InnerLoad

2017-12-09 15:39:24 795

原创 Spring缓存使用介绍

1. 不使用框架的缓存方案第三方的缓存实现已经有很多,有 guava cache、redis、tair等,它们解决的是缓存的底层问题。在不使用框架的情况下,参考之前的wikiGuava cache,在项目直接使用内存缓存。在业务逻辑比较简单时,使用这种方式简答可靠,实现成本较低。不过在业务场景比较复杂的场景下,这种使用方式的缺点有缓存逻辑与业务逻辑紧耦合替换第三方缓

2017-12-06 21:13:14 2390

原创 Guava cache介绍

Guava是谷歌开源的java工具类jar包,是Google的java核心库,许多java项目都依赖它。Guava包括:集合collections,缓存caching,原生类型primitives support,并发库concurrency libraries,通用注解common annotations等等。Guava cache 中文文档:http://ifeve.com/goo

2017-12-06 20:38:56 470

原创 Spring-AOP结合自定义注解的使用

最近在项目(IDEA+Spring+JDK1.6+)中,为了控制用户的读写权限,使用了AOP技术,将权限控制定义成了一个切面(Aspect)。1、AOP的基本概念AOP是spring框架中的重要特性,英文为Aspect Oriented Programming ,意思是面向切面编程。我们在系统开发中可以提取出很多共性的东西作为一个Aspect,可以理解为在系统中,我们需要很

2017-12-06 20:27:03 867

原创 Java自定义注解

最近在项目中用到了java的自定义注解,在解决问题之后,详细学习了java的自定注解的用法。1、注解的作用“注解”有注释、解释的含义。注解也是一种元数据,即是数据的数据,注解是描述java源代码信息的数据,是java源代码的元数据。注解(Annotation)在代码中添加标记信息,之后我们可以通过解析注解来获取标记信息,完成某些动作。SDK自带注解有以下几种:

2017-12-06 20:15:52 178

原创 闭包简介

1. 何为闭包在学习函数式语言、动态语言时会经常接触到一个概念——闭包,例如python、scala中都有对闭包的支持。翻看网上各种资料,对于闭包的解释都比较晦涩、学术。比如百科中这段解释:“在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它

2017-12-06 17:52:21 264

翻译 NASA的10条代码编写原则

英文原文:NASA’s 10 Coding Rules for Writing Safety Critical Program  美国宇航局(National Aeronautics and Space Administration,缩写为 NASA)是美国联邦政府的一个独立机构,负责制定、实施美国的民用太空计划、与开展航空科学暨太空科学的研究。在太空计划之外,美国国家航空航天局还进行长期

2017-12-06 17:36:41 511

原创 Java序列化与反序列化

一、序列化和反序列化序列化:把对象或数据结构转换为字节序列反序列化:把字节序列恢复为对象或数据结构当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。对象的序列化主要有两种用途:1. 把对象的字节序列持久化,或存

2017-12-03 23:31:04 283

关于matlab处理数字图像各种算法源程序

关于matlab处理数字图像如去噪增强滤波等各种算法源程序

2011-03-28

空空如也

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

TA关注的人

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