自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 设计模式——代理模式之CGLib实现分析JDK1.8(二)

上篇博客介绍了JDK当中提供的动态代理实现方式,这篇主要是来介绍,通过CGLib工具实现的动态代理。首先在maven项目当中添加jar包依赖 <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> ...

2018-07-31 21:36:45 329

原创 设计模式——代理模式之动态代理源码分析JDK1.8(一)

    代理模式其本质是,对于需要调用的方法,在其原由逻辑上进行修改,或者说是在原有方法的基础上前后都加上log日志,或者是对原有方法的结果进行二次处理等等。其结构图如下Subject     目标接口,定义RealSubject和Proxy的共同接口,RealSubject   具体的实现接口类,实现目标接口的功能Proxy   调用具体的实现接口类,并在具体实现...

2018-07-31 21:36:19 576

原创 设计模式——状态模式

    状态模式的设计实现主要是用来解决,不同状态下的不同用户行为,一般情况下,我们的处理方式是,根据状态不同,调用不同的方法,而状态模式的解决办法是,在某个对象当中持有一个状态对象的接口,当状态条件不同时,执行不同的具体的接口实现方法。    这样说可能还是比较抽象,举个例子,一个水桶,其状态可以分为三种,一种是水桶满的状态,还有一种是半桶状态,第三种是空桶状态,对于不同的状态下,我们能执行...

2018-07-31 21:35:49 274

原创 设计模式——观察者模式

   观察者模式主要是建立对象之间的一对多关系,当其中一方发生变化时,通知多个对应的对象,而具体什么时候去通知,这个就由具体的子类来实现。   下图当中给出的是观察者模式之间的结构关系图Subject    被观察的对象的抽象接口,其中包括需要通知观察者的集合,同时也提供了,添加观察者和移除观察者方法,以及通知所有的观察者的方法。ConcreteSubject   具体的被...

2018-07-30 21:43:30 212

原创 设计模式——装饰器模式(附java源码案例)

装饰器模式,其实又叫做包装模式,其主要作用就是将附加的功能添加到别的类当中,让这个类实现其包含的类的方法,在具体的调用时,就会按照包装顺序进行调用。Compoent   提供一个统一接口,是装饰类和被装饰类的基础类ConcreteComponent  具体的实现类,对于接口当中的方式进行实现Decorator    继承了Componet接口,同时包含了一个Compon...

2018-07-30 21:43:10 901

原创 设计模式——单例模式

关于单例模式,主要是为了一个类每次在使用它的实例时,都是同一个实例对象。单例模式一public class MySingleton { private static MySingleton instance = new MySingleton(); private MySingleton(){} public ...

2018-07-30 21:42:37 175

原创 设计模式——命令模式(附框架源码实现)

命令模式,其为了达到动作的请求者从动作的执行者当中进行解耦命令模式当中关系结构图Command:     定义命令的接口,以及执行命令的抽象方法ConcreteCommand:   命令的接口的实现对象,这个对象当中通常都持有一个接收者,调用接收者的功能来执行命令Receiver:   接收者,真正执行命令的对象,注意这个地方在ConcreteCommand当中很有可...

2018-07-30 21:42:21 628

原创 分库分表需要解决的问题(二)

上篇文章介绍了数据库优化,以及分库分表的一个概念,这篇主要是介绍分库分表需要解决的问题1、ID问题     当我们进行分库分表的拆分之后,如果继续使用原来的表自增的方式显然最终查询出来的结果会出现id重复问题,处理分库分表下的id,一般有两种方法1、1 UUID     使用uuid作为主键是最简单的方案,缺点也很明显,uuid长度太长,占据的空间比较大,作为索引并且基于索引的查询...

2018-07-30 20:02:32 2527 2

原创 MySQL语句执行优化及分页查询优化,分库分表(一)

下面是关于在使用SQL时,我们尽量应该遵守的规则,这样可以避免写出执行效率低的SQL1、当只需要一条数据时,使用limit 1     在我们执行查询时,如果添加了 Limit 1,那么在查询的时候,在筛选到一条数据时就会停止继续查询,但是如果没有添加limit 1即使只有一条数据,也会尝试去查询下一条满足条件的数据。2、对于搜索的字段创建索引    如果当前数据量很大的情况下,需...

2018-07-30 20:02:12 1711

原创 MySQL当中基于索引的加锁和死锁问题

    在介绍MySql引擎的时候,只是大概介绍了以下InnerDB支持行级锁、表锁,MyISAM支持表锁,这篇文章主要是来介绍关于数据库什么时候加锁,加什么样的锁,还有死锁的问题。    在介绍锁的相关内容之前,需要了解下关于MySql数据库的事务级别,MySQL数据库事务的特性和隔离级别    关于数据库当中锁的分类,及不同类型的锁,他们的特点    1、行锁:真对数据库当中特定的...

2018-07-26 22:17:53 3406

原创 数据库面试题整理

1、什么是事物?    被绑定在一起作为一个逻辑单元sql语句组,如果有任何一个语句操作失败,那么整个操作都会失败,然后回滚到操作之前的状态。    数据库事物的特性及含义:      原子性:整个事物的所有操作,要么执行,要么全都不执行      一致性:事物开始前和事物结束后,数据的完整性约束没有被修改      隔离性:如果有两个事物,运行在相同的时间内,执行相同的功能,...

2018-07-26 21:30:18 355

原创 MySQL数据库事务的特性和隔离级别

在介绍数据库事务以及隔离级别时,我们先来了解关于事务的几个概念关于事务的几个特性,简称ACIDA事务的原子性(Atomicity):对于一个事务要么全部执行,要么全部不执行,也就是说一个事务不可能执行一半就停止了。C事务的一致性(Consistency):事务的运行并不改变数据库的一致性。I事务的隔离性(Isolation):隔离性保证了并发执行多个事务和串行执行过个事务的效果是一...

2018-07-26 21:29:08 373

原创 数据库引擎对比InnerDB和MYISAM

   数据库存储引擎,是不同的存储技术将数据存储在文件或者内存当中,这些存储引擎当中每种都会使用不同的技术来进行数据的存储,索引技巧实现,或者说数据库锁的实现,通过这些不同的技巧来最终达到一定的效果。   主要来看下我们比较经常使用的InnerDB   InnerDB       InnerDB是一个事务型的存储引擎,主要是目的是大数据时提供高性能的数据服务,在运行时在内存当中建立缓冲...

2018-07-26 21:28:47 6753

原创 MySQL索引相关内容汇总

索引分类1、普通索引2、特殊键索引    2.1、主键索引:primary key    2.2、唯一索引:唯一键索引3、联合索引     包含两个,或者两个以上列的索引4、全文检索:用来搜索一段文章时效果最好5、空间索引:很少用到索引的实现方式   索引其实是一种存储结构,mysql数据库当中使用的InnerDB和MyISAM引擎都使用B+树来实现,这里就...

2018-07-25 19:58:20 380

原创 JVM常用的参数

主要是记录一些比较常用的JVM参数,总会有用到的时候。-XX:+PrintGC 打开GC的开关,如果系统发生GC,就会打印GC日志-XX:PrintGCDetails打印gc的详细信息-verbose:gc输出gc信息-XX:PrintGCTimeStamps打印GC,及GC发生的时间-Xloggc:/gc.log将gc的信息打印在当前应用的根路径的gc.l...

2018-07-23 21:28:59 163

原创 JAVA对象头信息

HotSpot虚拟机当中,java对象的结构包括以下几个方面,对象头、实例数据和对齐填充。对象头用来保存程序运行时,对象当中的信息,实例数据用来保存当前对象具体存储的数值。关于对象头当中存储的信息对象头包括两个部分:Mark Word和类型指针,如果是数组类型的话,还会多一个数组长度MarkWord    Mark Word当中包括,对象的hashCode,分代年龄,锁标记位,...

2018-07-23 21:28:46 1357

原创 CMS垃圾收集器执行过程

这篇博客主要是介绍CMS垃圾收集器的执行过程,并不会进行很详细的说明,如果想了解每个过程的详细步骤,可以查看下面的参考博客。   CMS垃圾收集器首先需要注意的一点,是用来对堆中老年代当中的垃圾进行回收的,CMS收集器的主要目标就是致力于降低垃圾回收的暂停时间,CMS GC和Full GC是不同的,CMS GC主要关注的是老年代的GC, Full GC是针对整个堆的GC。关于CMS垃圾收集...

2018-07-23 21:28:33 951

转载 什么时候触发MinorGC?什么时候触发FullGC?

触发MinorGC(Young GC)    虚拟机在进行minorGC之前会判断老年代最大的可用连续空间是否大于新生代的所有对象总空间    1、如果大于的话,直接执行minorGC    2、如果小于,判断是否开启HandlerPromotionFailure,没有开启直接FullGC    3、如果开启了HanlerPromotionFailure, JVM会判断老年代的最大...

2018-07-23 21:28:21 7445 6

原创 G1收集器

G1收集器是在JDK1.7开始可以设置使用,在JDK1.9时设置为默认垃圾收集器。G1收集器和其他收集器相比有以下特点并行与并发:G1能充分利用多CPU、多核的硬件优势,来缩短Stop-The-World停顿时间 分代收集:和其他收集器相同,分代概念依然保留。G1收集器不需要其他收集器的配合就可以管理整个堆,可以根据不同的方式去处理新创建的对象、存活了一段时间的对象和熬过多次GC的对象。 ...

2018-07-23 21:28:08 1971

原创 JVM什么情况下初始化一个类(代码示例)

在前面的日志当中,已经介绍过类的生命周期类加载  将已经存在的class文件从磁盘当中加载到内存中,查找类的二进制数据,如果不存在直接抛出异常连接  验证:确保被加载类的正确性,确保字节码没有被恶意修改  准备:为类的静态变量分配内存,并将其初始化为默认值,整型的默认值是0,引用类型是null, 程序当中赋值是1,但是这里会把int默认值设置为0,  解析:将类当中的符号引...

2018-07-19 21:12:59 295

原创 JVM加载类的方式及存在的问题(附带代码演示)

JVM当中提供了两种类加载器1、Java虚拟机自带的类加载器     根类加载器(Bootstrap)、扩展类加载器(Extension)、系统(应用)类加载器(System)2、自定义的类加载器   用户可以通过继承java.lang.ClassLoader类,然后重写自己定义的类加载器。何时加载一个类: 类加载器并不需要等到某个类在首次主动使用时再加载它。JVM规范允许...

2018-07-18 22:36:29 435

原创 JVM垃圾回收

之前我们介绍了jvm的内存结构,了解到对于程序计数器、jvm虚拟机栈和本地方法栈,是属于线程私有的,每个线程对应一套,而对于堆和方法区,是属于线程共享的,我们讨论的垃圾回收也主要是针对堆和方法区的内存回收  关于java堆内存的分配  虚拟机当中将堆内存从逻辑上分成了三大块:年轻代(Young Generation)、老年代(Old Generation)和持久代(Permanent Ge...

2018-07-11 20:28:20 152

原创 Java当中强引用、软引用、弱引用及虚引用

java当中提供了四种类型的引用,分别是强引用、软引用、弱引用和虚引用,java当中提供这些类型的引用,主要是为了方便在垃圾回收时,将不需要的对象清理掉,从而不至于引发OOM异常错误。强引用    在我们前面介绍java当中对象的生命周期时,如果一个对象有强引用关系,那么将不会被垃圾回收收走,哪怕是抛出OOM异常,也不会回收。通常我们通过new 的方式创建的引用,都是强引用关系Object obj...

2018-07-10 21:49:42 158

原创 JAVA反射中Class类源码分析及常见面试题

这篇博客主要是来分析下java反射机制实现的核心类Classpublic class Test { public static void main(String[] args) { Class clazz = String.class; Constructor[] constructors = clazz.getConstructors(); }}...

2018-07-10 20:46:06 838

原创 Java对象和类的生命周期

    在java当中一个对象被创建,再被引用指向,然后参与一系列的逻辑计算,到最后被垃圾回收掉,这个过程是怎样的,对我们开发来说也是极其重要的对象的生命周期       对象在JVM当中的生存周期一般都是从      创建(created)-->应用(in use)-->不可见(invisiable)-->不可达(unreachable)-->收集(collected)-...

2018-07-10 20:45:55 908

原创 Java内存结构

     这篇文章尽量将每个区域的作用,以及特点描述清楚,直到他们会在什么时候用到,关于其相关的概念,暂不做展开分析    java内存结构由以下几个部分组成        程序计数器        堆        本地方法栈        虚拟机栈(也叫java栈)        方法区接下来就主要介绍每个区的是干什么的,以及有什么作用程序计数器    ...

2018-07-10 20:45:44 551

原创 JAVA内存模型

这篇日志主要是来记录我在学习java内存模型的时候,需要了解的知识点。关于java内存模型这部分内容网上也有很详细的资料,这篇主要是做一个知识的梳理,总结。什么是java内存模型?在学习java内存模型的时候,我去网上找了很多资料,我发现大部分的文章,讲述的java内存模型都是这样子的主要是就是在介绍关于堆、栈啊,方法区,程序计数器之类的,这里需要明确一点,以上的模型图,是在描述java虚拟机的内...

2018-07-09 19:12:21 789

原创 LinkedHashMap源码分析

之前介绍过HashMap,HashMap的存储是无序的,LinkedHashMap在HashMap的基础上记录了每次添加的顺序,LinkedHashMap总体上实现方法大都是HashMap的方法。其实现方式,是数组+单向链表+双向链表+红黑树我们先来看下LinkedHashMap保存元素的结构static class Entry<K,V> extends HashMap.Node&lt...

2018-07-09 19:12:08 150

原创 TreeMap源码分析

TreeMap的内部维护了一个红黑树,从而来确保传入进去的元素都是按顺序保存的,我们查询出来的数据也是排序过得关于红黑树的基本操作可以参考我之前的一篇文章TreeMap红黑树基础相关内容介绍先来看添加元素操作public V put(K key, V value) { Entry<K,V> t = root; if (t == null) { //如果r...

2018-07-09 19:11:55 142

原创 java当中集合框架整理

这篇博客主要是记录一下java当中常用的那些集合框架源码分析的整理一下源码分析都是基于JDK1.8 ArrayList LinkedList Vector 源码对比分析HashMap源码分析LinkedHashMap源码分析ConcurrentHashMap 1.8源码分析(1)ConcurrentHashMap1.8源码源码分析(2)TreeMap源码分析HashSet和LinkedHashSe...

2018-07-09 18:56:43 144

原创 HashSet与LinkedHashSet分析

在前面已经介绍过HashMap和LinkedHashMap,在此基础上再来看HashSet和LinkedHashSet的源码会非常简单HashSet,其内部维护了一个HashMap和一个Object类型的对象,来保存每个元素对应的value值,HashSet其实就是HashMap当中key的集合,value使用的都是同一个object对象。对应的add方法和remove方法,分别调用的都是Hash...

2018-07-09 18:56:28 385

原创 J.U.C包文档分析目录

1、关于LockSupport()

2018-07-09 18:56:18 202

原创 JAVA当中内部类

成员内部类将一个类定义在另一个类内部,成员内部类可以访问其所在类的内部任何数据信息,私有变量,共有变量,静态变量,以及成员方法,静态方法,等所有属于外部类的代码对于外部类,如果想要访问内部类的一些方法或者属性,需要先构建好一个内部类对象public class Outer { private double radius = 0; public static int count = ...

2018-07-09 18:40:47 153

原创 JAVA当中的泛型

JAVA泛型其实是类型的类型,比如List数组我们可以接受任意类型的元素存储在数组当中,也可以在定义数组时,指定集合当中只存储某一类型。可以说泛型给我们的程序代码提供了可扩展性。关于泛型的声明,如何使用,这篇暂不介绍,我们从比较容易困惑的地方开始<? extend T> T可以是任意具体类型举个例子如果我们定义了一个方法,接受List<Number> 类型的参数,那我们是否...

2018-07-09 18:40:32 347

原创 java面试题整理(一)基础部分

Q:hashCode相同的两个对象一定相同吗?equals呢?A:都不一定,hashCode和equals都是可以随便重写的,但是JDK规定,equals相同hashCode一定相同,反之不一定,hashCode默认实现是对象在内存当中的地址。equals默认使用的是 ==Q:Hashtable、HashMap底层实现是什么?Hashtable和ConcurrentHashMap底层实现的区别?A...

2018-07-06 17:58:47 276

原创 ArrayBlockingQueue源码分析

简述:在jdk concurrent包下面提供了一些同步阻塞队列,这些队列在使用线程池的时候,会把超过核心线程数的任务放在阻塞队列当中,这篇文章主要是来看下ArrayBlockingQueue的源码。ArrayBlockingQueue是一个线程安全的有界队列,它的主要实现方式是Object[]数组,ReentrantLock,及ReenrantLock中的Condition ,如果对Reentr...

2018-07-05 18:08:45 420 1

原创 LockSupport工具使用和源码分析

简述:在前面几篇分析java并发工具的博客当中,基于AQS实现的,底层都会用到LockSupport所提供的park和unpark(Thread)方法来进行线程的挂起和唤醒,所以这篇文章我准备来看下LockSupport到底是如何实现线程挂起和唤醒的,以及它有哪些比较好的功能,可以在以后开发当中使用。我们知道在java当中我们可以使用Object类当中的wait方法和notify方法来实现线程的阻...

2018-07-05 16:04:57 221

原创 线程池ThreadPoolExecutor源码分析(二)

简述:在上一篇博客当中介绍了java当中提供的线程池的内容,线程池介绍和常用的线程池分析(一)这篇文章主要是分析下实现线程池的源码ThreadPoolExecutor。以下内容基于JDK1.8关于ThreadPoolExecutor的基本参数我们在上篇文章当中已经介绍过了,现在先来看下ThreadPoolExecutor的继承关系体系我们从上往下看下,每个类或者接口主要是提供了哪些方法...

2018-07-05 10:46:33 209

原创 线程池介绍和常用的线程池分析(一)

简述:我们在使用线程的时候,去创建一个线程来执行是非常方便的,如果一个线程的执行时间比较短,而我们又需要创建大量的线程,那么再每次使用时都重新去创建一个线程,显然创建线程和最终使用完线程对线程进行销毁都是非常浪费资源的,因此,java当中就提供了线程池,在一个任务执行结束之后,另外的任务也可以继续使用这个线程进行执行。在了解jdk提供的各种线程池之前,我们先来了解线程池当中基础属性的含义,以及线程...

2018-07-04 16:31:56 261 2

原创 java并发包中Semaphore使用及源码分析

Semaphore是一个线程控制器,初始化时,给定一个线程数量,用来控制同一时刻,只能有指定数量的线程在执行,如果有其他线程,只能等待其中的线程释放掉之后,才可以继续执行。Semaphore的源码分析Semaphore的内部结构是Sync, 分别由NonfairSync 和 FairSync实现,整体来说和ReentrantLock比较类似,不同的是,sync方法当中实现的是AQS中的tryAcq...

2018-07-03 17:57:13 318

空空如也

空空如也

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

TA关注的人

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