自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 手写一个公平锁

公平锁:先调用加锁的线程优先得到锁,通过队列来实现package MyLock;import java.util.ArrayList;import java.util.List;public class FairLock { private boolean isLocked = false; private Thread lockingThread = nu...

2019-03-02 16:41:18 271

原创 自己实现一把重入锁

实现一把不能重入的锁:package MyLock;public class MyLock { private boolean isLock; public synchronized void lock(){ while (isLock){ try { wait(); } ...

2019-03-02 15:42:55 169

原创 JDK源码阅读

Object1) wait(), notify(), notifyAll(), wait(timeout)2) hashCode(), equals()3) clone()hashCode(), equals()关系: 因为重写的equal()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高,那么h...

2019-02-22 09:57:41 196

原创 @Autowire原理分析

源码如下: public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); context.scan("service"); context.refresh(...

2019-02-21 18:32:10 2952 3

原创 手写RPC框架-基于BIO

RPC概述RPC(Remote Proceduce Call 远程过程调用) 一般用来实现部署在不同机器上的系统之间的方法调用,使程序能够像访问本地系统资源一样,通过网络传输过去访问远端系统资源。RPC 调用过程    Client 客户端调用方法实现,负责发起RPC调用。    ClientStub/SereverStub 可以看作一个代理对象,屏蔽RPC调用过程中复杂的网络处理逻辑...

2019-02-21 09:47:53 190

原创 Tomcat启动流程图

  Tomcat启动流程图 

2019-02-20 14:32:34 1001

原创 springboot中tomcat的启动入口在哪?

在springboot中,是融合了tomcat的启动与加载的,那么关于tomcat的启动与加载的入口就是研究的第一步,在EmbeddedWebApplicationContext类中,重写了AbstractApplicationContext的finishRefresh()方法,如下:? 1 2 3 4 5 6 7 8 ...

2019-02-20 13:49:46 4842

原创 Spring Boot内嵌Tomcat启动

之前在Spring Boot启动过程(二)提到过createEmbeddedServletContainer创建了内嵌的Servlet容器,我用的是默认的Tomcat。 private void createEmbeddedServletContainer() { EmbeddedServletContainer localContainer = this.embe...

2019-02-20 10:31:05 1180

原创 Tomcat整体架构分析

本章结构如下:    前言    Tomcat顶层结构    Server    Service    Connector    Container    Tomncat启动流程一、前言一般而言,对于一个复杂的系统,直接扎进去看源码会是很难受的,会浪费大量的时间和脑细胞,却得不到理想的效果。这个时候,策略很重要,应该明白,越是复杂的东西,越会有良好的逻辑和层次,否则开发...

2019-02-19 15:55:45 297

原创 Tomcat调用链路

 Tomcat Server处理一个http请求的过程假设来自客户的请求为:http://localhost:8080/wsota/wsota_index.jsp1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应3) Eng...

2019-02-19 15:28:58 386

原创 Tomcat架构图

tomcat目录结构tomcat的下载安装有很多教程,不再赘述。现在的tomcat已经到9了,当tomcat下载安装完成后,其目录大致如下: 3.1、bin文件夹bin文件夹下面放的是可执行性文件,其中:bat/exe文件是Windows下可执行的脚本文件。sh文件时Linux/Unix下可执行的脚本文件。    bootstrap.jar:这个jar包是引导程序jar...

2019-02-19 15:03:49 1755

原创 原 MyBatis源码阅读——装饰器模式在MyBatis中的应用

Executor首先我们看下Executor,打开MyBatis的源码org.apache.ibatis.session.Configuration  public Executor newExecutor(Transaction transaction, ExecutorType executorType) {    executorType = executorType == nul...

2019-02-15 14:17:27 245

原创 Mybatis一级缓存与二级缓存

一、MyBatis缓存介绍  正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。  2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCa...

2019-02-15 10:40:20 104

原创 自己手写一个Mybatis框架

 继上一篇手写SpringMVC之后,我最近趁热打铁,研究了一下Mybatis。MyBatis框架的核心功能其实不难,无非就是动态代理和jdbc的操作,难的是写出来可扩展,高内聚,低耦合的规范的代码。本文完成的Mybatis功能比较简单,代码还有许多需要改进的地方,大家可以结合Mybatis源码去动手完善。一、Mybatis框架流程简介在手写自己的Mybatis框架之前,我们先...

2019-02-14 16:02:44 275

原创 自己手写一个SpringMVC框架

Spring框架对于Java后端程序员来说再熟悉不过了,以前只知道它用的反射实现的,但了解之后才知道有很多巧妙的设计在里面。如果不看Spring的源码,你将会失去一次和大师学习的机会:它的代码规范,设计思想很值得学习。我们程序员大部分人都是野路子,不懂什么叫代码规范。写了一个月的代码,最后还得其他老司机花3天时间重构,相信大部分老司机都很头疼看新手的代码。  废话不多说,我们进入今天的正题,在W...

2019-02-14 16:00:56 196

原创 MyBatis原理第四篇——statementHandler对象(sqlSession内部核心实现,插件的基础)

首先约定文中将的四大对象是指:executor, statementHandler,parameterHandler,resultHandler对象。(为了方便下面的文章说道四大对象就专指它们)讲到statementHandler,毫无疑问它是我们四大对象最重要的一个,它的任务就是和数据库对话。在它这里会使用parameterHandler和ResultHandler对象为我们绑定SQL参数和...

2019-02-13 15:08:32 193

原创 MyBatis架构图

2019-02-13 15:02:01 641

原创 MyBATIS插件原理第二篇 Mapper运行原理

我们目前在MyBATIS中,我们知道MyBATIS的Mapper是一个接口,而不是一个实体类。在Java中接口是没有办法运行的。那么它是怎么运行的呢?有了第一篇的基础,我们可以大胆的想象——它是通过动态代理运行,没有错真实的情况就是这样的。让我们看看mybatis是怎么实现这个动态代理的:    /**     *    Copyright 2009-2015 the origina...

2019-02-13 14:55:05 222

原创 MyBATIS插件原理第一篇——技术基础(反射和JDK动态代理)

在介绍MyBATIS插件原理前我们需要先学习一下一些基础的知识,否则我们是很难理解MyBATIS的运行原理和插件原理的。MyBATIS最主要的是反射和动态代理技术,让我们首先先熟悉它们。1:Java反射技术在Java中反射技术已经大行其道,通过不断的优化性能得到了巨大的提高,而反射技术使得Java的可配置性大大提高。让我们来写一个服务打印hello + 姓名。    import ...

2019-02-13 14:47:32 242

原创 MyBATIS原理第三篇: SqlSession下的四大对象之一——执行器(executor)

首先我先解释一下标题 四大对象是指:executor, statementHandler,parameterHandler,resultHandler对象。(为了方便下面的文章说道四大对象就专指它们)它们都是sqlSession的底层类实现,也是插件能够拦截的四大对象。所以这里已经触及了MyBATIS的底层,动态代理,反射随时可以看到,如果没有第一篇作为基础,你将十分难以理解它。了解他们的协作...

2019-02-13 14:40:42 248

原创 MyBatis源码阅读—解析MyBatis运行流程

前言最近在阅读MyBatis框架的源码。发现它其实是一个非常值得阅读的框架。它灵活得运用了常见的设计模式去设计。值得我们去学习。我还是比较喜欢以debug阅读MyBatis的源码。下面,就一起来看看吧。首先,我们先写一个demo,以供调试使用public class Demo1SessionFactory {public static void main(String[] args) th...

2019-02-13 11:03:35 136 1

原创 Java多线程中的notify和notifyAll的区别

既然说到多线程,首先要引入几个概念。1、锁池:直白的说就是等待竞争锁的池子,比如当前竞争的对象的锁已经被其中一个线程取得,其他线性等待锁释放后开始竞争,这些等待的线程总和我们就可以叫锁池。2、等待池:某个线程调用了某个对象的wati()方法,释放了锁,进入不竞争锁的状态。我们可以说这个线程进入了等待池。区别如果线程调用了对象的 wait()方法,那么线程便会处于该对象的等待池中,等待池...

2019-02-12 17:40:44 441

原创 mysql锁机制

1、查看数据库哪些表被锁过show OPEN TABLES where In_use > 0;2、加锁lock table t_emp read;3、解锁UNLOCK TABLES;

2019-02-01 15:17:32 98

原创 MySQL中的锁(表锁、行锁)

锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。 概述    相对其他数据库而言,MySQL的锁机制比较简单...

2019-02-01 11:46:20 105

原创 Spring中用到的设计模式

spring中常用的设计模式达到九种,我们举例说明:第一种:简单工厂又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象,但是否是在传入参数后创建还是传入参数前创...

2019-02-01 11:10:36 89

原创 使用show profiles分析SQL性能

使用show profiles分析SQL性能  分析SQL执行带来的开销是优化SQL的重要手段。在MySQL数据库中,可以通过配置profiling参数来启用SQL剖析。该参数可以在全局和session级别来设置。对于全局级别则作用于整个MySQL实例,而session级别紧影响当前session。该参数开启后,后续执行的SQL语句都将记录其资源开销,诸如IO,上下文切换,CPU,Memory...

2019-02-01 09:33:43 310

原创 mysql使用存储过程&函数实现批量插入

写这边文章的目的,是想结合mysql 存储过程+函数完成一个批量删除的功能吧…正好也好加深下对procedure和function的熟练操作吧…表结构:create table dept(id int unsigned primary key auto_increment,deptno mediumint unsigned not null default 0,dname varchar...

2019-02-01 09:28:39 334

原创 mysql查询截取分析

MySQL 慢查询 一般分析过程:至少跑一天,观察,看生产的慢SQL情况。开启慢查询日志,设置阈值,如超过5秒就是慢查询,将其抓取下来。explain SQL 分析show profileDBA 或运维 进行SQL服务器参数调优查询优化永远小表驱动大表永远小表驱动大表,因为先查小表可以得到一些接下来查询的过滤条件,再查大表时可以根据这些过滤条件用上索引等内容增加整体查询速度。I...

2019-02-01 09:21:19 162

原创 分页查询优化-使用覆盖索引

优化前的sql:优化后的sql:内查询使用覆盖索引,加快查询效率

2019-01-31 14:18:04 443

转载 索引失效的原因

索引失效的原因1.隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误.由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效.错误的例子:select * from test where tu_mdn=13333333333;正确的例子:select * from test wher...

2019-01-31 09:53:07 9165 3

原创 MySQL高级 之 explain执行计划详解

使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。explain执行计划包含的信息id:select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序1、id相同:执行顺序由上至下2、id不同:如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行3、id相同又不...

2019-01-30 11:19:48 215

原创 mysql架构

mysql架构图

2019-01-29 17:00:46 115

原创 static执行顺序

1、static定义的变量和静态代码块,根据编写顺序先后执行package com.study;public class ClassWithStatic {public static void main(String[] args) {System.out.println(“public static void main(String[] args)”);Super.getInstanc...

2019-01-26 16:09:14 501 1

转载 基于Zookeeper的分布式锁

实现分布式锁目前有三种流行方案,分别为基于数据库、Redis、Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开。我们来看下使用Zookeeper如何实现分布式锁。什么是Zookeeper?Zookeeper(业界简称zk)是一种提供配置管理、分布式协同以及命名的中心化服务,这些提供的功能都是分布式系统中非常底层且必不可少的基本功能,但是如果自己实现这些功能而且要达...

2019-01-25 16:27:56 117

转载 Java锁有哪些种类,以及区别(转)

在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下:公平锁/非公平锁可重入锁独享锁/共享锁互斥锁/读写锁乐观锁/悲观锁分段锁偏向锁/轻量级锁/重量级锁自旋锁上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。公平锁/非公平锁公平锁是指多个线程按照申请锁...

2019-01-25 10:57:37 110

转载 Java GC日志查看

Java中的GC有哪几种类型?参数描述UseSerialGC虚拟机运行在Client模式的默认值,打开此开关参数后,使用Serial+Serial Old收集器组合进行垃圾收集。UseParNewGC打开此开关参数后,使用ParNew+Serial Old收集器组合进行垃圾收集。UseConcMarkSweepGC打开此开关参数后,使用ParNew+CMS+Serial Old收...

2019-01-24 20:40:41 359

原创 Java -verbose:gc 命令

Java -verbose:gc 命令JVMGC垃圾回收Java虚拟机Java -verbose:gc 中参数-verbose:gc 表示输出虚拟机中GC的详细情况.使用后输出如下:[Full GC 168K->97K(1984K), 0.0253873 secs]解读如下:  箭头前后的数据168K和97K分别表示垃圾收集GC前后所有存活对象使用的内存容量,说明有168K-97...

2019-01-24 20:38:47 485

转载 JVM中垃圾收集器 serial、parNew、parallel Scavenge;serial old、parallel old、CMS、G1

serial收集器:单线程,“stop the world”,进行垃圾收集线程时必须停止所有工作线程;parNew收集器(parallel并行):多线程,进行垃圾收集时也会停止工作线程;两者都能与CMS(concurrent mark sweep)收集器配合使用;三者都关注尽可能缩短垃圾收集时用户线程的停顿时间。并行(parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待...

2019-01-24 11:41:52 875

转载 AQS详解

一、概述谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch…。以下是本文的目录大纲: 概述 ...

2019-01-22 11:25:28 183

转载 JUC回顾之-CyclicBarrier底层实现和原理

1.CyclicBarrier 字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是让一组线程到达一个屏障(同步点)时被阻塞,直到最后一个线程到达屏障时候,屏障才会开门。所有被屏障拦截的线程才会运行。2.常用的方法:复制代码CyclicBarrier(int parties)创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,...

2019-01-22 10:47:36 1528

空空如也

空空如也

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

TA关注的人

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