- 博客(128)
- 资源 (2)
- 收藏
- 关注
原创 Socket的深入理解之一
这几天看了看Socket相关的内容,很有收获记录一下。1.什么是Socket?Socket本质上还是文件,因为Linux上一切皆文件。Socket也有对应的文件描述符(fd)。文件描述符相关的参考另外一篇博客。在这里简单就认为,它是对应着一个文件的,就可以。Socket位于TCP/IP之上,通过Socket可以方便的进行通信连接。对外屏蔽了复杂的TCP/IP。
2017-09-27 12:34:06 3026
转载 Linux IO模式及 select、poll、epoll详解
注:本文是对众多博客的学习和总结,可能存在理解错误。请带着怀疑的眼光,同时如果有错误希望能指出。同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。本文讨论的背景是Linux环境下的network IO。一 概念说明在进行解释之前,首先要说明几个概念:- 用户空间和内核空间
2017-07-09 21:19:23 389
原创 Spring源码解析之三 ------ bean的初始化(IOC的第二步)
在前两篇博客里,讲了spring对于自定义标签和默认标签的初始化过程。对于bean标签的解析注册,这只是IOC的第一步,而我们知道,我们经常用的bean默认是单例的,而且是spring为我们提供好的。这就涉及到IOC的第二步,为bean生成实例。 public void refresh() throws BeansException, IllegalStateException { s
2017-07-04 01:09:54 1074
原创 Spring源码解析之零 ------ 容器初始化过程(refresh()方法)概要
本篇主要讲解,容器初始化时候的refresh()方法里的,几个重要方法的基本作用。首先来看一下refresh()方法。spring容器的启动,创建bean,bean的初始化等一系列过程都在这个refresh方法里面,进行调用。 public void refresh() throws BeansException, IllegalStateException { synchro
2017-07-03 13:43:41 5449
原创 Spring源码解析之四 ------ AOP原理和源码分析
在介绍AOP之前,想必很多人都听说AOP是基于动态代理和反射来实现的,那么在看AOP之前,你需要确实弄懂动态代理和反射。巧了,我这里就有。JDK的动态代理的实现和源码分析,参见我的这两篇文章JDK的动态代理源码分析之一 ( http://blog.csdn.net/weililansehudiefei/article/details/73655925 )JDK的动态代理源
2017-06-28 08:40:53 6093
原创 Spring源码解析之二 ------ 自定义标签的解析和注册(IOC的第一步)
在《spring源码解析之一 ----- 默认标签的解析注册》中,已经介绍了Spring对于默认标签(beans、bean、alias、import)的解析注册。看到这个时候,你也会明白,我们常用的aop标签,并不是spring的默认标签,而是自定义标签。spring对自定义标签,提供了良好的扩展和支持。在上篇文章中,按照源码看bean的解析过程中,在下方的代码里,是自定义标签和Default标
2017-06-27 01:16:11 973
原创 Spring源码解析之一 ------ 默认标签的解析注册(IOC的第一步)
要看Spring bean加载的过程,最好的是Debug跟着流程走,有所侧重的看。首先需要的搭建本地环境和简单的项目工程,搭建的方法我放在这篇博客里。我也是看了不少博客,Debug了很多次才终于理解整个过程。第一次看的时候,别心急,几天看完第一次都没关系。我相信这篇文章,能让你看懂bean加载。《这里应该介绍一下web工程读取xml的顺序,然后加载》一、schema、xsd的认识
2017-06-26 20:08:26 1125 1
原创 springMVC使用@ControllerAdvice实现异常处理
@ControllerAdvice注解的类,会被作用于@RequesMapping注解的方法上。先来看看它的基本实现@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface ControllerAdvice {被Component注解,说明
2017-06-24 15:12:28 4431
原创 JDK动态代理源码分析之二
在上篇文章里对JDK动态代理的方法和源码进行了简单的分析,这篇主要讲述怎么将JDK的代理生成的class文件进行输出。以下是调用的文件,其他的文件均和 JDK动态代理之一 中的一致(http://blog.csdn.net/weililansehudiefei/article/details/73655925)package com.weili.cn;import java.lang.
2017-06-24 00:08:56 1039
原创 JDK动态代理源码分析之一
一、JDK动态代理的Demo接口:package com.weili.cn;/** * Created by weili on 17/6/23. */public class Animal implements AnimalInterface { public void sound() { System.out.println("Animal miao m
2017-06-23 23:41:01 1844
原创 Java虚拟机之类加载(双亲委派模型)
类加载器完成”通过一个全限定名来获取描述此类的二进制字节流“动作的代码模块叫做类加载器。对于同一个类,需要由类加载器和这个类本身一桶确立其在Java虚拟机中的唯一性。每一个类加载器都有一个独立的类名称命名空间。换句话说,比较两个类是否相等,必须在这两个类是同一个类加载器加载的前提下,进行比较才有意义。否则,即使这两个类来自同一个class文件,被同一个虚拟机加载,只要加载它们的类加载器不同
2017-05-17 14:16:27 433
原创 Java虚拟机之垃圾收集算法
一、标记-清除算法算法分为标记和清除两个阶段。首先标记需要回收的所有对象,然后在标记完成后,统一回收所有被标记的对象。不足:1.效率问题。标记和清除两个过程的效率都不高 2.空间问题。标记清除之后会产生大量的不连续内存碎片。空间碎片太多,在分配大对象时候没有足够空间,那么就会触发另一次垃圾回收动作。二、复制算法复制算法将可用内存按照容量大小划
2017-05-16 21:44:44 629
原创 Java虚拟机之Java内存区域划分
一、Java虚拟机在执行Java程序的过程中,会把所管理的内存区域划分为多个不同的数据区域:方法区、堆、Java虚拟机栈、本地方法区、程序计数器。二、程序计数器程序计数器是线程私有的。所谓线程私有就是说,多个线程之间互不影响,独立存储。若一个线程正在执行一个Java方法,那么程序计数器记录的是正在执行虚拟机字节码指令的地址;如果正在执行的是Native方法,那么这个计数
2017-05-16 18:22:42 450
原创 String中的加号和字符串拼接的理解
直接看代码 String str1 = new String("abc"); String str2 = "abc"; String str3 = "a" + "b" + "c"; System.out.println(str1.intern() == str2); //输出true
2017-05-05 19:08:21 10585 1
原创 String直接赋值和new一个对象的理解
我们直接来看两句代码 String str1 = new String("abc"); String str2 = "abc"; System.out.println(str1 == str2); //输出false首先,既然有new这个关键字,那么一定要在堆内存中开辟空间,存放数据。所以 str1 指向的是堆内存中
2017-05-05 18:50:57 5584
原创 Java final关键字和String常量 不可变的理解
final首先来说说final。对于基本数据类型的变量,一旦用final修饰,就表示这个变量不能被再次赋值。对于对象形的变量,指的是这个引用不可变。而这个引用指向的堆内存区域中的值是可以变的。例如: final List list = new ArrayList(); list.add(1); list.add(2);上面定义了List类型的集合对象,我们知道上面代码的第
2017-05-05 18:31:27 2075 2
原创 Java并发之CountDownLatch的使用和源码解析
CountDownLatch构造方法它在初始化时候,可以通过构造函数新建一个类似于计数器的功能。 public CountDownLatch(int count) { if (count < 0) throw new IllegalArgumentException("count < 0"); this.sync = new Sync(coun
2017-05-03 13:13:03 412
原创 Java线程池
java线程池。在jdk5之后为我们提供了线程池,只需要使用API,不用去考虑线程池里特殊的处理机制。jdk5线程池分好多种,固定尺寸的线程池、可变尺寸连接池等。常用的是ThreadPoolExecutor,它的构造方法如下:public ThreadPoolExecutor(int corePoolSize, int max
2017-04-30 21:50:45 1405
原创 多线程:为什么在while循环中加入System.out.println,线程可以停止
在论坛看到这样一个代码,public class StopThread { private static boolean stopRequested; public static void main(String[] args) throws InterruptedException { Thread backgroundThread = new Thre
2017-04-28 13:37:21 3905 7
原创 【JDk源码解析之四】Vector源码解析
1.Vector也是集合类,继承和实现方式如下,它也是实现了list接口。很多博客说Vector和ArrayList基本都是一样的,只不过Vector是线程安全的。但是具体是什么样的,还需要简单看看源码。当然其实还是有区别的,只是区别不大。2.Vector的属性定义具体的三个属性 解释看图中注释。Vector没有采取ArrayList临界值扩容的办法,而是每次不够的时候,直接根据c
2017-04-16 00:32:42 388
原创 【JDk源码解析之三】HashMap源码解析
1.HashMap的实现了Map接口,继承于AbstractMap2.我们常说HashMap是数组加链表的实现形式,那么就具体来看看。HashMap的主要属性定义如下图。先说数组+链表,数组只的就是table[]数组,这个数组是Entry类型的,而Entry类类型于我们常用的Node节点,Entry有(k,v,next)属性。默认初始化容量为13.具体方法分析3.1 构
2017-04-15 19:27:30 428
原创 【JDk源码解析之二】LinkedList源码解析
1.LinkedList的继承关系如图,和ArrayList一样都实现了List接口。但是ArrayList是基于动态数组的实现,LinkedList是基于链表的实现。2.LinkedList是基于链表实现的,增加和删除容易,查找相对费时间。首先来看LinkedList的Node节点定义,如图所示。可以看到Node节点不仅有只向下一个节点的引用,还有只向前一个节点的引用,是双向
2017-04-15 13:46:33 394
原创 【JDk源码解析之一】ArrayList源码解析
1.ArrayList的继承关系如图所示:2.宏观上说,ArrayList是基于动态数组实现的,数组具有按索引查找的特性,所以访问很快,适合经常查询的数据。3.具体源码解析。 为什么说ArrayList是动态数组,这个可以看它的构造函数。如下图所示,有两个构造方法,存放元素的elementData是一个数组,同时被初始化。ArrayList的放的元素就是放 在这个
2017-04-15 02:12:21 5117 3
转载 网络编程释疑之:同步,异步,阻塞,非阻塞
一讲到网络编程的I/O模型,总会涉及到这几个概念。问了很多人,没几个能清晰地讲出他们之间的区别联系,甚至在网络上也有很多不同的观点,也不知是中国文字释义的博大精深,还是本来这几个概念就是绕人不倦。今天我也来给大家讲解一下我对这几个概念的理解。既然网络上众说纷纭,不如找个权威参考一下,这个权威就是《UNIX网络编程:卷一》第六章——I/O复用。书中向我们提及了5种类UNIX下可用的I/O
2017-10-06 13:13:45 601
转载 每天进步一点点——Linux中的文件描述符与打开文件之间的关系
1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件
2017-09-27 15:08:11 890
原创 锁和分布式锁的一些理解
一、锁1.自旋锁自旋锁是一种非阻塞锁,也就是说,如果某线程需要获取自旋锁,但该锁已经被其他线程占用时,该线程不会被挂起,而是在不断的消耗CPU的时间,不停的试图获取自旋锁2.互斥锁互斥锁是阻塞锁,当某线程无法获取互斥锁时,该线程会被直接挂起,不再消耗CPU时间,当其他线程释放互斥锁后,操作系统会唤醒那个被挂起的线程。阻塞锁可以说是让线程进入阻塞状态进行等待,当获
2017-09-20 09:56:32 1753
原创 Java集合类Set的add方法妙用
关于这个Set方法的妙用,主要在于Set集合的add方法。我们知道Set集合是可以去重的,就是没有相同的元素。在执行add方法时候,如果这个元素已经在set中存在,那么就返回false,否则返回true。所以,我们可以根据返回值,来确定当前添加的元素是否已经在set中存在。这个是在leetcode做一道数独问题时候,碰到的,感觉很不错。原题:https://leetcode.com
2017-08-24 00:40:30 10523
原创 自定义注解实现Excel的解析生成
1.自定义注解import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * Created by weili on
2017-07-27 15:25:26 2153 1
原创 Java 中的Date(获取一天的开始和结束时间)
这两天写定时任务,需要每小时去执行和每天8点执行。如何从现在的时间,获取昨天的时间。现将代码整理如下 @Override @Scheduled(cron = CRON_EXPRESSION) public void execute() { LOG.info(String.format("定时查询还款总额任务开始,时间:%s!",new Date()
2017-07-25 14:57:41 27208 2
原创 Cron表达式
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: Seconds Minutes Hours DayofMonth Month DayofWeek Year或 Seconds Minutes Hours DayofMonth Month DayofWeek每一个域可出现的字符如下: Seconds:可出现",
2017-07-25 14:54:33 306
原创 java---interrupt、interrupted和isInterrupted的区别
1、interrupt() interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。
2017-07-11 16:04:52 479
原创 死锁产生的必要条件
死锁产生的原因及四个必要条件产生死锁的原因主要是:(1) 因为系统资源不足。(2) 进程运行推进的顺序不合适。(3) 资源分配不当等。如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。产生死锁的四个必要条件:(1) 互斥条件:一个资源每
2017-07-09 23:55:23 423
原创 Leetcode 287 Find the Duplicate Number
int findDuplicate3(vector& nums){ if (nums.size() > 1) { int slow = nums[0]; int fast = nums[nums[0]]; while (slow != fast) { slow = nums[slow]; fast = nums[nums[fast]]; } fast =
2017-06-30 11:46:25 303
原创 Leetcode 442. Find All Duplicates in an Array
public class Solution { // when find a number i, flip the number at position i-1 to negative. // if the number at position i-1 is already negative, i is the number that occurs twice.
2017-06-30 10:25:56 242
原创 Leetcode 448 Find All Numbers Disappeared in an Array
public List findDisappearedNumbers(int[] nums) { List res = new ArrayList<>(); int n = nums.length; for (int i = 0; i < nums.length; i ++) nums[(nums[i]-1) % n] += n; f
2017-06-30 10:23:49 263
原创 Spring之bean加载源码阅读工程搭建
一、spring.xml<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/conte
2017-06-26 20:14:28 488
原创 SpringBoot Mock测试
今天用Mock测试Controller的时候,刚开始发现Controller里面的Service没有被实例化,也就是没有注入bean。原先的测试代码,我没有通过AutoWired注解注入repaymentScheduleController,而是直接在setup里面new了一个Controller。正常运行后的代码:package com.creditease.microloa
2017-06-26 13:33:45 7437
原创 SpringAOP的实现原理
AOPAOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与
2017-06-24 15:58:21 2099
转载 Java:Object类详解
Java 问答:终极父类Java的一些特性会让初学者感到困惑,但在有经验的开发者眼中,却是合情合理的。例如,新手可能不会理解Object类。这篇文章分成三个部分讲跟Object类及其方法有关的问题。上帝类问:什么是Object类?答:Object类存储在java.lang包中,是所有java类(Object类除外)的终极父类。当然,数组也继承了Object类
2017-05-16 22:45:57 500
原创 集合迭代器 listIterator()
直接来看代码:1、遍历注意获取listIterator迭代器之后,必须调用next()方法,才算进入到list的第一个元素。代码中 iter,next(),就是为了让迭代器只向list的第一个元素。所以,可以理解成,直接获取迭代器后,迭代器的对象指向的是一个head节点,它的下一个才是开始遍历的元素。import java.util.LinkedList;import java.ut
2017-05-14 14:51:30 2408
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人