自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(80)
  • 资源 (6)
  • 问答 (1)
  • 收藏
  • 关注

原创 synchronized锁优化前传-Java对象结构解析

我们经常会说到synchronized是一把重量级的锁,难道是因为这把锁有几斤?我们也常听到说,在JDK1.6中对其进行了优化,那么又是怎么实现的?想了解这些,我们必须先详细的了解Java对象的结构。一:Java对象,请掀起你的盖头来以下是64位JVM下的对象结构描述:对象结构可以看到,在Java中,对象的结构主要分为:对象头,实例数据以及填充数据。...

2020-04-11 12:20:40 1224

原创 cglib动态代理实现原理详细分析

在之前Java代理模式中大致的分析了下代理模式的类型及对每种代理类型简单的举例了下。在上篇JDK动态代理实现原理详细分析中,对其JDK代理的流程做了一个详细的分析。而本文,将介绍另一种动态代理模式:cglib动态代理。阅读完本文,你将对cglib代理模式的运行的流程有一个清晰的认识。本文的目录如下:目录一:cglib动态代理的样例展示二:cglib生成的代理类的分析三:cgli...

2020-01-13 16:37:11 3687

原创 JDK动态代理实现原理详细分析

在之前Java代理模式中大致的分析了下代理模式的类型及对每种代理类型简单的举例了下。本文将对JDK动态代理进行详细的分析。读完本文,你将对JDK的动态代理的运行流程,生成的代理类结构以及实现的原理有一个更加深入的认识。本文将从以下几个方面概述:目录一:JDK动态代理简单样例二:JDK动态代理生成的代理类分析三:JDK动态代理运行流程分析四:JDK动态代理源码分析一:JD...

2020-01-13 16:36:53 774

原创 Java并发编程之synchronized解析

初学Java多线程的时候,遇到需要线程同步的地方,总是会用到synchronized关键词。很简单的就是帮助我们实现预想的“效果”。殊不知,synchronized是一个重量级的锁,使用不当的话其实会使我们程序执行的效率大打折扣。以下,一:synchronized的作用范围synchronized可作用在普通的方法上,静态方法上以及同步代码块上。以下,我将分别的对这三种情况做一个分析。1:...

2019-03-16 18:13:50 269

原创 Java并发编程之线程状态与创建线程的方式

在Java并发编程中,线程所处的状态以及创建线程的方式算是’开学第一课’了。而从本文开始,我将对Java并发做一个系统的认识。话不多说,开始进入主题。一:线程状态在Thread类中详细的枚举了线程的状态,如下: public enum State { /** * 创建了线程还未调用srart()方法的时候,线程处于NEW的状态 */...

2019-03-02 13:41:42 301

原创 Spring源码分析之createBean主流程分析

我们知道,在调用getBean获取bean实例的实例,首先会从缓存中获取bean实例,如果没有获取到,就会去创建bean的时候。关于获取bean实例,可以参考Spring源码分析之getBean主流程分析,而本文将会对创建bean实例的主流程来做一个分析。而入口,当然是createBean(AbstractAutowireCapableBeanFactory)的方法。下面来看源码:pro...

2019-01-20 15:21:35 637

原创 Spring源码分析之getBean主流程分析

当我们通过向Spring容器获取某个bean的时候,总是调用Spring中重载的各种getBean方法。那么,getBean中的流程是什么样的?通过本文,你将对getBean方法的主流程有一个详细的认识。入口当然是getBean方法: public Object getBean(String name) throws BeansException { return doGetBe...

2019-01-08 23:23:35 2849

原创 Spring源码分析之BeanFactory初始化

在上一篇Spring源码分析之IOC容器创建过程中,大致梳理了一下IOC容器初始化的流程。在初始化的过程中,会调用模板方法refresh(),在刷新工厂方法中,首先会获取beanFactory,即以下这行代码:ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();beanFactory的初始化大致可分...

2018-12-11 12:26:23 1245

原创 Spring源码分析之IOC容器创建过程

我们知道,Spring框架基于IOC容器能够实现依赖注入,使代码之间不在具有高度的耦合关系.解耦给问我们带来很多的好处,不仅会使我们的代码更加容易扩展维护,同时也更加方便测试。在Spring中,我们常使用ClassPathXmlApplicationContext(类路径下读取配置),XmlWebApplicationContext(web环境下加载配置),AnnotationConfigApp...

2018-12-04 23:14:35 1140

原创 小结

新的一年,希望自己能够多看一些专业书籍,加油!

2017-12-31 22:51:12 184

原创 MAVEN工程JAR包丢失问题

问题背景: Tomcat 服务器运行一个Maven工程后,重新加入另一个之前能够运行的Maven工程一直失败,并报一下错误.java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener at org.apache.catalina.loader.WebappClassL

2017-11-28 14:57:40 3007

原创 SpringMVC+Spring+Mybatis基于Maven的整合

其整合工程的目录结构如下:首先是pom.xml文件中的内容:<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://m

2017-10-28 22:16:39 351

转载 互联网协议入门(二)

上一篇分析了互联网的总体构思,从下至上,每一层协议的设计思想。这是从设计者的角度看问题,今天我想切换到用户的角度,看看用户是如何从上至下,与这些协议互动的。互联网协议入门(二)(接上文)七、一个小结先对前面的内容,做一个小结。我们已经知道,网络通信就是交换数据包。电脑A向电脑B发送一个数据包,后者收到了,回复一个数据包,从而实现两台电脑之间的通信。数据包的结构,基本上是下面这样:发送这个包,需要知道

2017-09-30 16:32:53 201

转载 互联网协议入门(一)

我们每天使用互联网,你是否想过,它是如何实现的?全世界几十亿台电脑,连接在一起,两两通信。上海的某一块网卡送出信号,洛杉矶的另一块网卡居然就收到了,两者实际上根本不知道对方的物理位置,你不觉得这是很神奇的事情吗?互联网的核心是一系列协议,总称为”互联网协议”(Internet Protocol Suite)。它们对电脑如何连接和组网,做出了详尽的规定。理解了这些协议,就理解了互联网的原理。下面就是我

2017-09-30 16:04:13 218

原创 排序算法之快速排序

快速排序每趟排序的结果是:在选取的基准值得左边全部比其小,而右边都比其大。 下面的采用快速排序第一遍的演示: 其代码(Java)如下:import java.util.Arrays;/** * 快速排序 * * @author sg */public class TestQuickSort { public static void main(String[] args)

2017-09-30 15:27:17 366

原创 二分查找之Java实现

非递归与递归两种方法实现:/** * 二分查找:非递归的方法 * 缺点:有序数组中含有多个待查找的数值的时候,这种方法只能显示一个 * @param src //带查找的有序数组 * @param des //带查找的数值 * @return //查找数值的下标,没有查找到返回-1 */ public int bina

2017-08-18 13:09:49 237

原创 Spring 之通知的类型以及切面的优先级

Spring AOP编程,即面向切面编程,那么什么是切面?先看下面的例子:一个简单的加减乘除public interface Calculate { int add(int x,int y); int sub(int x,int y); int mul(int x,int y); int div(int x,int y);}public class

2017-07-08 18:31:32 1549

原创 Spring之自动装配

Spring自动装配分为利用xml配置文件配置和注解的方式进行自动装配两大类xml配置(常用):byType:通过类型来装配beanbyName:通过名称来装配bean//接口dao:package com.sg.dao;public interface UserDao { void save(); }//实现类package com.sg.dao.impl;i

2017-07-07 12:40:50 425

原创 Spring之创建bean的方式

学习Spring有一段时间了,这里会把一些知识点给梳理一遍。这里要说到的是-Spring创建bean的四种方式:整个工程的目录结构,用maven进行了管理: 配置文件applicationContext.xml:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/bea

2017-07-06 15:13:17 606

原创 Java并发编程之CountDownLatch

在Java.util.concurrent包下,有一个CountDownLatch类。官方定义:A synchronization aid that allows one or more threads to wait untila set of operations being performed in other threads completes.其能够根据给定的初始值,调用await()方法

2017-06-12 00:26:24 584

原创 Java并发编程之CAS算法

在多线程环境下,我们要实现对一个变量自增的话,往往会使用java.util.concurrent.atomic包下的相关实现类。 如下:public class TestAtomic { public static void main(String[] args) { ThreadDemo td=new ThreadDemo(); //开启二十个线程完成自加操

2017-06-11 11:16:21 1203

原创 Java并发编程之volatile解析

在对该关键字进行认识之前,需要对Java内存模型有一定的认识。 Java内存模型规定了所有的变量都存储在主内存中,每个线程都有自己的工作内存,线程的工作内存保存了该线程使用到的变量的是主内存副本的拷贝,线程对于变量的操作(读取,复制)都必须在工作内存中进行,而不能直接读写主内存中的变量。 在进行变量操作的时候,如果每次都是从主内存中读写,无疑是影响性能的, 即一个线程在操作某一个变量之前,会先

2017-06-11 00:56:44 705

原创 数据库事务的隔离级别

事务的隔离级别分为以下四种:对事务的基本操作/*查看事务的隔离级别*/SELECT @@tx_isolation;/*查看事务是否自动提交*/SELECT @@autocommit;/*设置隔离级别为读已提交*/SET tx_isolation='READ-UNCOMMITTED';/*设置隔离级别为读已提交*/SET tx_isolation='READ-COMMITTED';/*设置隔

2017-06-03 12:56:35 562

原创 Java代理模式

本文将从以下几个方面进行阐述:静态代理: 其类图如下: 真实角色与代理类同时实现一个接口,真实角色只处理与它核心业务相关的,其他的全部由代理角色完成。/** * 抽象接口 * @author sg */public interface Subject { void printBeforeLogging(); void operation(); void printAft

2017-05-31 23:15:07 414

原创 Java NIO的非阻塞式网络通讯

之前说过NIO与传统IO不同有一点是NIO是非阻塞的,当线程从某通道进行读写数据时,若没有数 据可用时,该线程可以进行其他任务。线程通常将非阻塞 IO 的空闲时间用于在其他通道上执行 IO 操作,所以单独的线程可以管理多个输入和输出通道。因此,NIO 可以让服务器端使用一个或有限几个线程来同时处理连接到服务器端的所有客户端。 在使用的时候,需要设置相应的管道为非阻塞的,这里会用到选择器,相应的事

2017-05-11 15:39:26 819

原创 Java NIO的Scatter与Gather

Scatter(分散):分散读取,从管道Channel中读取的数据分散到一个或者多个缓冲区Buffer中,分散的时候会依次的按缓冲区的顺序一个一个的进行。 Gather(聚集):聚集写入,把缓冲区position到limit之间的数据依次的写入到管道中。 这样,一个大文件就可以分割成许多小的文件进行传输。 其示意图如下: 代码实现如下:public class Demo06_ScotterA

2017-05-11 15:12:54 816

原创 Java NIO的Channel

NIO中通道由 java.nio.channels 包定义的。Channel 表示 IO 源与目标打开的连接。Channel 类似于传统的“流”。只不过 Channel本身不能直接访问数据,Channel 只能与Buffer 进行交互。

2017-05-11 14:52:37 558

原创 Java NIO的Buffer

前面说到的NIO中Buffer一个用于保存特定基本数据类型的容器,其底层就是一个数组。 可以看到,基本类型除了boolean,其他的都对应一个Buffer的实现类。对于抽象类Buffer,需要理解其以下几个属性: private int mark = -1; //标志位,标记后能使调用reset方法能够恢复到标记时的位置 private int position = 0; //相当

2017-05-11 12:14:27 431

原创 Java NIO 与IO的区别

在jdk1.4中,引入了NIO(NEW IO),其与传统的IO有着很大的差别,具体表现在:1:面向流与面向缓冲区传统IO面向流的,意味着每次从流中读取一个字节或多个字节,直到读取完所有字节,而没有缓冲的,想要缓冲的就得使用相应的缓冲流。对于InputStream与OutputStream要么是输入流,要么是输出流而不能复用。NIO是面向缓冲区的,说道缓冲区就必须要提到通道,什么是通道与缓冲区?可以这

2017-05-11 10:19:42 694

原创 Java_LinkedHashSet工作原理

Hash table and linked list implementation of the Set interface, with predictable iteration order. This implementation differs from HashSet in that it maintains a doubly-linked list running through a

2017-05-04 15:10:02 1026

原创 Java_LinkedHashMap工作原理

Hash table and linked list implementation of the Map interface,with predictable iteration order. This implementation differs from HashMap in that it maintains a doubly-linked list running through all

2017-05-04 14:50:11 3721 3

原创 Java_HashSet工作原理

This class implements the Set interface, backed by a hash table (actually a HashMap instance). It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that th

2017-05-03 23:53:30 1275

原创 Java_LinkedList工作原理

Doubly-linked list implementation of the List and Deque interfaces. Implements all optional list operations, and permits all elements (including null).LinkedList实现了list接口,其底层实际上一个双向链表,其基本操作就是对双向链表的操作

2017-05-03 17:47:11 1527

原创 Java_ArrayList的工作原理

Resizable-array implementation of the List interface. Implementsall optional list operations, and permits all elements, includingnull. In addition to implementing the List interface, this class pro

2017-05-03 14:03:30 582

原创 Java-try_catch_finally中带有return语句的执行顺序

我们知道,在try_catch_finally块对异常进行捕捉时,一定会执行到finally块中的语句。看下面例子:Test1:(try语句中有return,finally中没有) public static void main(String[] args) { System.out.println(test()); } public static int tes

2017-05-03 11:59:35 366

原创 Java自动装箱与拆箱

Java的原始数据类型有byte,boolean,short,char,int,float,long,double 而包装类对应的分別有Byte,Boolean,Short,Chararcter,Integer,Float,Long,Double 自动装箱就是Java自动把原始数据类型装换为对应的包装类,而自动拆箱就是把对应的包装类转换为原始数据类型; 看如下代码:Integer i=10;

2017-04-23 17:39:42 284

原创 Struts2中OGNL的解析

OGNL是Object Graphic Navigation Language的缩写,顾名思义,对象图导航语言。它是struts2框架的默认的表达式语言。 通过OGNL,我们可以在jsp的页面中很方便获取一些我们所需要的值。那么,能获取哪些值,怎么获取的这些值?这里我们先清楚三个概念:ActionContext,ValueStack与StarkContext. ActionContext:Act

2017-04-09 16:27:15 353

原创 struts2的启动流程与请求流程

从点击服务器(这里说到的服务器为tomcat)的start来启动服务,到对服务器发出请求,中间经历了一个怎样的过程?启动流程: WEB服务器启动: 1- 加载解析 $CATALINA_HOME/conf/web.xml 2-加载每个WEB app 下的 web.xml 3-对于struts2框架,在web.xml中,会配置拦截器,如下。这时候会初始化 StrutsPrepareA

2017-04-08 15:13:46 574

原创 Java并发编程之线程池

线程是一种稀缺的资源,如果对于每一个任务都来创建一个新的线程来处理,不仅会消耗系统的资源,还会是降低系统的稳定性。使用线程池能够统一的对线程分配与管理。——-类结构图 1-在接口Executor中,只有一个void execute(Runnable command)方法 2-ThreadPoolExecutor,多线程的核心类。 3-ScheduledThreadPoolExecutor,继承

2017-03-15 16:11:44 385

原创 Java线程之Timer

很多时候,我们需要周期性的执行某个任务,在JDK1.5之前,有一个Timer类。其官方文档中这样描述一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行其执行任务的时候,需要调用schedule方法。schedule重构了四个方法,如下:void schedule(TimerTask task, Date time) // 安排在指定的时间执行指定的任务void

2017-03-13 17:13:50 308

sourcetree破解版以及破解证书

sourcetree破解版以及破解证书,可使用其中的证书,亦可以直接安装破解版

2018-06-20

JsonArray与JsonObject所需包

JsonArray与JsonObject所需的完整的依赖包,下载导入后可直接使用

2017-10-13

五子棋算法源码

五子棋算法源码(命令行编译之后可直接运行,IDE工具的编译环境为jdk)

2017-06-11

五子棋项目源码

Java五子棋项目源码,因上传大小限制,删除了编译之后的代码,只保留了源码。(命令行编译之后可直接运行,IDE工具需把编译环境改为jdk)

2017-06-11

全国省市区插入SQl语句

全国省市区插入的sql语句(可直接运行)

2017-03-29

Tomcat源码

Tomcat源码,包含注释部分

2016-12-02

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

TA关注的人

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