- 博客(48)
- 资源 (6)
- 收藏
- 关注
原创 RateLimiter源码解读
RateLimiter源码解读最近使用了Guava提供的限流器RateLimiter觉得十分好用,遍想一探究竟。RateLimiter使用的限流算法为令牌桶,这里对令牌桶算法不做过多的解释,不懂的同学可以搜索一番。限流器创建public static RateLimiter create(double permitsPerSecond) { return create(permitsPerSecond, SleepingStopwatch.createFromSystemTimer());
2020-12-22 00:12:14
426
原创 netty源码浅析--accept
前面我们分析了netty线程启动和服务器bind的过程,接着我们要分析的是服务器accept的过程。 我们先看一下java nio中是怎么处理accept这个操作的。我们截取java nio中的一个代码片段。 selector获取活跃key之后,然后会判断key是否是可accept的,如果是则执行accept操作。我们都知道netty是对java nio的封装,所以对netty的
2017-07-07 19:59:38
1761
原创 基于netty的网络聊天室
基于netty和mybaties的网络聊天室登录界面 一对多聊天界面 注册界面 注册失败界面 github: https://github.com/hustchai/Chat
2016-09-16 10:44:05
1884
1
原创 daoHelper
根据sql语句自动生成po,dao,xml。github: https://github.com/hustchai/dao-helper
2016-09-16 10:29:42
1261
原创 netty源码浅析--线程启动
一直对Java高并发比较感兴趣,最近在学习netty特来记录。 提到netty首先要了解一下什么是Reactor设计模式,在网上找了一下关于Reactor设计模式的介绍,链接在文档的最下方。 在《Scalable IO in Java》中讲到了一种多线程下的Reactor模式。 在这种设计模式中,有一个前端mainReactor主要负责响应client的连接请求并建
2016-08-20 16:42:17
2868
原创 Java中断初窥
在使用Linux时我们经常可以通过在终端键入 kill quit命令,来结束指定任务。那么Java怎么让一个线程停止呢。其中的一种方法就是让线程中断,什么是中断呢? 在百度百科查到的解释是:指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫
2016-06-03 19:56:48
525
原创 Java动态代理
Spring中的AOP是基于Java动态代理实现的,那么什么是动态代理呢?既然“动态代理”有代理两个字,那么肯定和代理模式有关系喽。 代理模式是经典的23种设计模式之一。简单的说,代理模式就是为其他对象提供一种代理,以控制对这个对象的访问。对于什么是代理模式不过多进行解释。 那么什么又是动态代理呢?动态代理是相对于静态代理来说的,静态代理的代理类是手工书写的或者通过工具生成,
2016-05-29 17:00:04
459
原创 设计模式之回调模式
回调在Spring中被大量使用,那什么是回调呢? 简单的说,在A类中调用B类的C方法,然后B类调用A类中的D方法。方法D被称为回调方法。回调是实现异步的基础。经典的回调方式如下:Class A实现回调接口CallBack——背景1class A中包含一个class B的引用b ——背景2class B有一个参数为callback的方法f(CallBack callback) —
2016-05-26 17:37:44
8964
原创 Tomcat源码分析--一次HTTP请求过程
前两篇我们分析了Tomcat服务的启动过程和Connector(连接器)。现在让我们看看一次Tomcat服务器是怎么提供HTTP服务的。 上文我们说到endpoint是底层处理I/O具体实现类,那么一次HTTP首先也要从这个类中开始。还是以NIOEndPoint实现类为例子。在NIOEndPoint类中有一个名为Acceptor内部类。该内部类负责接收即将到来的TCP/IP连接,并将它们
2016-05-08 20:37:45
4524
1
原创 Tomcat源码分析--启动过程
一直使用Tomcat确不知道它的运行原理。看了源码后对它的启动过程有了一定的了解,特来记录一下。 首先先介绍一下Tomcat的架构图: Tomcat主要有两个核心的组件,一个是Connector(连接器)和容器。所谓连接器就是当有HTTP请求到来时,连接器负责接收这个请求,然后将该请求转发到容器。容器有Engine,Host,Context,Wrapper。Engine:表示
2016-04-26 16:52:09
9206
原创 Java并发之AbstractQueuedSynchronizer分析
在并发程序中一般使用锁对共享变量进行互斥访问。在java程序中一般用synchronized关键字来实现线程对共享变量的互斥访问。而从JDK1.5以后java并发大师 Doug Lea 开发了AbstractQueuedSynchronizer(下文用AQS代替)组件,使用原生java代码实现了synchronized语义。我们通过介绍AQS最常用的ReentrantLock锁来介绍AQS。AQS有
2016-02-03 21:05:31
2786
原创 java并发之CAS操作
CAS即compare and set的缩写。常见于java.util.concurrent中,是构成concurrent包的基础。CAS有三个操作数,内存值M,旧的预期(expect)值E和更新(update)值U。在CAS操作中,只有当M==E时,才会更新U。否则什么都不做。这些操作都是原子的。
2016-01-29 15:55:30
2377
原创 设计模式之原型模式
使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。在说什么是原型模式前首先要解释一下两个概念,深复制和浅复制。 浅复制:复制一个对象时,基本类型字段复制其值,引用类型复制其引用。 深复制:复制一个对象时,不仅复制对象的基本类型的字段,而且也复制引用对象的对象。java中使
2016-01-25 13:12:32
515
原创 Java并发之读者写者模型
问题描述:设想一个飞机订票系统,其中有许多竞争的进程试图读写其中的数据。多个进程同时读取是可以接受的,但如果一个进程正在更新数据库,则所有的其他进程都不能访问数据库。即便是读操作也不行。Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。import java.util.concurrent.Executor;import java.ut
2016-01-24 21:01:30
2145
2
原创 设计模式之生成器模式
将一个复杂对象的创建和它的表示分离,使得同样的创建过程可以有不同的表示。应用场景:一水杯工厂要生产各式各样的水杯,无论杯子是神马造型,但都包括绳子,帽子和杯体。以此模型创建各种类型的杯子。类图 cup类public class Cup { private String string; //绳子 private String cap; //帽子 private
2016-01-19 10:27:30
2556
原创 设计模式之抽象工厂
抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。应用场景:想必大家都玩过暴力摩托这款游戏(暴露了年龄),在游戏中赛车手可以骑行摩托和携带武器,我们假定他拿的武器是AK47(好拉风有木有)。这只是在普通的模式下,现在我们虚拟一个魔法模式。在魔法模式下赛车手骑的是扫把(对,你没有看错,是扫把)
2016-01-15 12:07:56
379
原创 java并发之生产者消费者模型
生产者和消费者模型是操作系统中经典的同步问题。该问题最早由Dijkstra提出,用以演示它提出的信号量机制。经典的生产者和消费者模型的描述是:有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区中;消费者进程可从一个缓冲区中取走产品去消费。尽管所有的生产者进程和消费者
2016-01-10 14:21:30
3748
原创 Java并发之volatile
volatile有两个特性确保volatile修饰的变量对所有线程可见。禁止指令重排确保volatile修饰的变量对所有线程可见为了解释第一个特性,首先我们要知道java内存模型,java内存逻辑上分为工作内存和主内存(这里内存的定义和我们平常所说的java内存分为堆、栈、方法区等并不冲突)java内存模型规定所有的变量都存在主内存中,每条线程还有自己的工作内存,工作内存中保存了该线程使用到变
2016-01-08 12:54:25
1013
原创 Android与服务器端通信时 部分中文出现乱码
在android与服务器端通信期间出现部分中文有乱码,如图所示: 众所周知,乱码出现在两种不同的编码格式相互转换过程中,而在项目的一开始便约定所有的编码格式都采用UTF-8 mysql编码 服务器端返回数据编码 由于项目采用的是SpringMVC 所以只需要将其如下配置即可返回UTF-8格式的编码 而在本机中使用httpClient进行http模拟时 数据也正常返回。所以将问题锁定在an
2015-12-16 14:20:04
1594
原创 git连接本地服务器教程
1、前期准备服务器上配置好的gitgit客户端 1.1 在服务器上安装git (本机所使用的linux是ubuntu) 在服务器输入命令:sudo apt-get install git即可 然后创建名字为git的用户组和用户1.2 下载客户端 在浏览器地址栏输入:https://git-for-windows.github.io/ 回车后 点击Download进行下载2、具体
2015-11-13 20:28:55
12856
原创 Java虚拟机基础知识
最近拜读了《深入理解Java虚拟机》,读完之后受益匪浅。这篇博客也算自己读完之后的一些总结吧。 Java程序运行时会将自己所管理的内存分为以下几个区域,程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、运行时常量池、直接内存。如图1所示: 自我理解,程序计数器功能如cpu控制单元内的指令寄存器IR。程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的
2015-11-08 19:20:35
695
原创 使用cookie绕过验证码进行模拟登录
1.工具 httpClient jar包 任意抓包工具 推荐 firefox的 firebug(非常好用)在使用httpClient进行模拟登录时,有时候会遇到需要输入验证码的情况。而对验证码进行识别的方法既费时效果还不好。这里提供一个取巧的方法,即使用浏览器登录时产生的cookie进行登录。2.上代码 首先是一个模拟http请求的工具类import java.io.IOException;
2015-10-19 22:59:21
13631
1
原创 JAVA利用泛型返回类型不同的对象
有时需要在方法末尾返回类型不同的对象,而return 语句只能返回一个或一组类型一样的对象。此时就需要用到泛型。首先先解释个概念, 元组: 它是将一组对象直接打包存储于其中的一个单一对象,这个容器对象允许读取其中元素,但不能修改。利用泛型创建元组public class ReturnTwo<A,B> { public final A first; public final B sec
2015-09-24 22:43:37
9062
原创 Springmvc+mybatis 问题总结(续ing)
1、java.lang.IllegalStateException: getWriter() has already been called for this response拦截器中相关代码@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
2015-09-23 15:58:26
654
原创 JAVA中复杂对象调用构造器顺序
最近读《JAVA编程》思想有点心得,给大家分享下。 关于Java中复杂对象调用构造器顺序,话不多说直接上代码public class A { public A() { System.out.println("A被初始化了"); }}public class B { public B() { System.out.println("B被初始化了")
2015-09-15 22:35:10
1484
原创 设计模式之工厂模式
根据单一职责原则,专门的类用来实例化对象。我们习惯把这种类叫做工厂。 public interface Ihelper { void open(); void close(); }public class ORACLEHelper implements Ihelper{ @Override public void open() { Sy
2015-08-09 14:55:39
391
原创 Hadoop WordCount源码解读
MapReduce编程模型MapReduce采用“分而治之”的思想。将HDFS上海量数据切分成为若干块,将每块的数据分给集群上的节点进行计算。然后通过整合各节点的中间结果,得到最终的结果。 HDFS上默认块的大小要比磁盘默认的大小大的多。其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间明显大于定位这个块开始位置所需时间。这样,传输一个由多个块组成的文件时间取决于磁盘传输速率。
2015-07-26 17:43:04
3427
1
原创 Ubuntu环境下安装jdk
ubuntu环境下安装jdk1.工具 工欲善其事必先利其器,首先需要工具若干 ① ubuntu 12.04以上的环境 ② jdk源码包本教程默认已经安装好ubuntu12.04以上的环境。 jdk源码包可以在oracle官网上下载到,地址为: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-213
2015-07-07 21:45:29
630
原创 基于springmvc+mybatis+easyui的后台管理系统Demo
效果图上面只是简单的功能展示。具体功能实现有:1,树形菜单 2,更改皮肤 3,分页显示 4,批量删除 5,增加用户 6,删除用户 7,更新用户网盘链接:http://pan.baidu.com/s/1kT1RZHP
2015-06-27 11:12:10
4876
原创 关于eclipse创建android项目没有自动生成r文件的解决方法
1 第一看xml文件里面有没有错误2 一定要把project->Build automatically勾选上
2015-03-26 12:35:10
1699
原创 已知一颗二叉树S的前序遍历和中序遍历 序列,请编程输出二叉树S的后续遍历序列.
#include #include //在中序中查找根的下标int FindRoot(char c, char in[], int s, int e){int i;for(i=s; i{if(in[i] == c){break;}}return i;}/* *递归遍历求得后序 *@pre:先序序列 *@pre_
2015-02-25 14:23:23
2174
1
转载 约瑟夫环
#include#include/*约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列依此规律重复下去,直到圆桌周围的人全部出列。*/int main(){ int n; printf("报数出列游
2015-02-22 17:23:31
476
原创 全排列,回溯
#include#define n 3int a[n];int vis[n+1];void dfs(int cur){if(cur == n){int j;for(j = 0 ; j printf("%d",a[j]);}printf("\n");}int i;for(i = 1 ; i if(vi
2015-02-20 17:29:05
539
原创 LCS 最长公共字串
#include#includeint c[10000][10000];char str1[10000];char str2[10000];void func(int m,int n) {if(m return ;int i,j;for(i = 0 ; i for(j = 0 ;j c[i][j] = 0;int besti = 0,
2015-02-17 10:35:18
527
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人