自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(180)
  • 资源 (1)
  • 收藏
  • 关注

原创 SpringBoot启动

前言之前已经介绍了SpringBoot jar启动过程。现在我们来看SpringBoot入口类main方法的执行。@SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(M...

2019-01-11 16:13:33 371

原创 SpringBoot Jar启动

SpringBoot项目的启动当我们在IDE中新建(或导入)了一个SpringBoot项目之后,我们如果想要启动这个SpringBoot项目,我们可以找到相应的带有@SpringBootApplication注解的启动类,该启动类是一个带有main方法的类,这个类就是SpringBoot项目的入口。所以想要运行的话,只需要在IDE对这个类点击Run As Java Application既可以启...

2019-01-11 16:13:00 2654

原创 Spring Task

前言在一开始学习定时任务的时候是使用的quartz来实现的。后来习惯于全注解的开发模式。在SpringBoot环境中,只需要在启动类上加上EnableScheduling注解,然后在需要使用定时任务的方法上加上Scheduled注解,当然方法所属的类需要在Spring环境中。在启动类中加上EnableScheduling注解这一步是为了生成ScheduledAnnotationBeanPostP...

2018-12-25 17:03:32 1652

原创 线程池

为什么要使用线程池为了尽可能的去压榨CPU,我们会在程序中使用多线程技术,这样在一些情景下会显著的减少CPU的闲置时间,增加CPU的吞吐能力。假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程...

2018-12-25 16:15:27 253

原创 两条实用的sql语句

在开发的过程中,我们有时候会遇到一些处理数据库数据的需求。INSERT INTO …SELECT语句有时候我们需要批量的把某张表中一些符合条件的数据插入到另一张表中。Mysql提供了一个很方便的语句。Insert into Table2(field1,field2,...) select value1,value2,... from Table1 [where column =value]...

2018-12-24 19:38:12 233

原创 对sql语句也要有敬畏之心

前言在上个月,在帮同事解决bug的时候,我人生中第一次看到了对datetime类型的字段做like查询的sql语句…案发现场分析这是一条很简单的语句,查询某个月某个用户的签到记录 SELECT * FROM xxxx where uid = #{uid} AND sign_date lik...

2018-12-24 18:21:11 252

原创 SimpleDateFormat线程安全问题

前言最近在查资料的时候,偶然看到了SimpleDateFormat不是线程安全的类的相关资料,说实话,一开始看的时候还是惊讶了一把的,从来没想过这个类居然不是线程安全的。今天就来看看这个类的线程安全问题。SimpleDateFormat线程安全分析先看一个很简单的日期处理工具类public class DateUtil { private static final SimpleD...

2018-12-24 15:46:35 261

原创 @ResponseBody作用在返回类型为String的方法时的坑

在默认的Spring配置中,当在返回类型为String的Controller方法时,在其上加上@ResponseBody时会出现问题,那就是返回的不再是我们期待的Json格式的字符串了,而是会变成在正常的Json串前后加上双引号。这是为什么呢?这是因为在HTTPMessageConverter中对应写json格式相应的处理类在写json的时候默认是对String类型进行这样处理的。以Gson为例...

2018-12-21 15:58:44 11438 4

原创 消息转换器

前言在使用SpringMVC的过程中,我们如果想要返回json格式的数据(Response的Content-Type: application/json;charset=UTF-8),通常使用@ResponseBody注解,引入相应的json解析包就可以了,如果想要解析前端传来的json格式的数据(request header Content-Type为application/json),在Co...

2018-12-21 15:58:15 924

原创 SpringMVC处理方法的具体逻辑

在讲解SpringMVC整体设计的时候,我们只分析了最顶层的核心接口,但是SpringMVC还有很多可以去探究的细节,还有很多我们可以扩展的接口,我们继续来深入学习SpringMVC。在整体设计分析中,我们知道一个Web请求进来时依靠HandlerMapping来找到正确的Controller以及Controller下对应的@RequestMapping注解修饰的方法的。而具体的方法处理的逻辑是...

2018-12-21 15:57:39 321

原创 git remote prune origin

最近在开发的时候偶然发现,同事在本地使用git branch -a会看到我已经删除的远程分支,git fetch之后依然能看到,然后同事就来询问我为什么不清理掉那些久远的分支,然而我确实是执行了git push origin --delete branchName删除每个版本后不用的分支。当时感觉非常奇怪,然后又发现,我在本地也能看到同事已经删除的远程分支。当时我就蒙蔽了,非常蒙蔽。后来查找资料才...

2018-12-20 17:51:29 13108 1

原创 @Async原理

前言在开发过程中,我们会遇到很多使用线程池的业务场景,例如定时任务使用的就是ScheduledThreadPoolExecutor。而有些时候使用线程池的场景就是会将一些可以进行异步操作的业务放在线程池中去完成,例如在生成订单的时候给用户发送短信,生成订单的结果不应该被发送短信的成功与否所左右,也就是说生成订单这个主操作是不依赖于发送短信这个操作,所以我们就可以把发送短信这个操作置为异步操作。而...

2018-12-20 17:37:14 21355

原创 @Autowired

前言最近在使用@Async注解进行异步操作的时候时,想过一下@Async注解的原理,这种需要@Enable*注解开启作用的注解,原理应该是大同小异。之前已经分析过了@Scheluded注解了,本以为这次看@Async注解会很轻松,但是还遇到了很多问题。我们知道在调用带有@Async的方法的时候,会将这个方法作为一个任务放入到线程池中执行。如果我们想要自己配置线程池的属性,只需要实现Async...

2018-12-20 17:09:00 307

原创 请求从客户端到服务器的过程简单分析

当我们在客户端(以浏览器为例)使用域名发送一个HTTP请求的时候,DNS协议会尝试将域名解析为对应的IP。(我们知道每一个台服务器都可以通过ip和端口直接被访问。但是,用户对于由数字组成的ip是很难有记忆点的,所以就出现了域名,域名可以映射到ip。那么域名是如何与ip进行映射的,就需要DNS协议的帮忙)1.OS会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址...

2018-12-20 16:02:01 3813

原创 Java中的四种引用

前言最近又重新看了下ThreadLocal,ThreadLocal源码中ThreadLocalMap内部类的Entry中的key是ThreadLocal类型,并且是弱引用。 static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated ...

2018-12-19 18:24:29 183

原创 finalize

前言在总结Java中的4种引用的时候,在查找资料的时候,看到了有关于Object#finalize()方法的一些介绍,提到我们不应该在程序中使用finalize()方法,该方法不安全,低效,不要去使用finalize()去完成资源释放工作,而是使用虚引用完成对象回收前的资源释放工作。但是并没有给出具体的原因,那今天就结合网上的资料和自己的理解来分析这个finalize()方法。为什么不要使用f...

2018-12-19 15:58:10 180

原创 ThreadLocal引发的Bug

前言最近同事在开发的时候,在调用RPC获取用户的积分的时候,发生了返回的用户以及积分信息不是我们请求的uid对应的用户信息的情况,uid变成了另一个人的uid,积分信息也变成了另一个人的,是不是很神奇。同事叫我帮忙查找原因,RPC和调用方的代码都是该同事写的,我在本地用他给的请求参数去请求那个RPC,发现确实会出现那么神奇的情况,返回的信息不是请求参数中的用户的信息。反复请求几次,依旧是这样。...

2018-12-19 10:39:44 700

转载 并发与并行的区别

如果某个系统支持两个或者多个动作(Action)同时存在,那么这个系统就是一个并发系统。如果某个系统支持两个或者多个动作同时执行,那么这个系统就是一个并行系统。并发系统与并行系统这两个定义之间的关键差异在于**“存在”**这个词。在并发程序中可以同时拥有两个或者多个线程。这意味着,如果程序在单核处理器上运行,那么这两个线程将交替地换入或者换出内存。这些线程是同时“存在”的——每个线程都处于执行过...

2018-12-18 17:47:13 662

转载 ReentrantReadWriteLock

前言之前分析了使用AQS实现的共享锁和独占锁,今天来分析一下ReentrantReadWriteLock,这个即使用了共享锁(读锁)又使用了独享锁(写锁)的类。与Mysql中的S锁(共享锁,读锁)一样,ReentrantReadWriteLock中的读锁只允许继续加读锁,而不允许加写锁。而写锁则与Mysql中X锁(排他锁)一样,不允许继续加任何锁,知道写锁被释放。今天我们就来分析下Reen...

2018-12-18 17:29:51 246

原创 LimitLatch

前言之前分析的ReentrantLock和CountDownLatch都是JDK中对AQS的利用,分别实现了独占锁和共享锁。接着我们再来看一个LimitLatch,来学习下我们可以怎么将AQS应用到我们自己的程序中。LimitLatch这个类是我在看Tomcat源码的时候看到的,当时并没有太在意,也是这次复习JUC包的时候突然想起的,所以就想着来看下具体实现。Tomcat使用LimitLat...

2018-12-18 16:11:36 638

原创 CountDownLatch

在复习了ReentrantLock可重入的独占锁后,我们来分析下使用了共享锁的CountDownLatch。CountDownLatch使用示例先看一个CountDownLatch的使用示例。package com.wangcc.springbootexample.concurrency;import java.util.Random;import java.util.concurre...

2018-12-18 15:19:24 157

原创 ReentrantLock

在分析了AQS之后,再来看ReentrantLock就非常简单了。ReentrantLock是一个可重入的独占锁。我们来看下具体的实现。先看构造方法 /** Synchronizer providing all implementation mechanics */ private final Sync sync; public ReentrantLock() { ...

2018-12-18 14:48:07 2978

原创 AQS

前言最近打算重新温习下JUC包,去年虽然有看过相关源码,但是理解的并不到位,最近不是特别忙,就打算花这个时间重新来梳理下。先从JUC中锁的实现的核心AQS说起。AQS是一个抽象类,提供了一系列公共的方法,比较重要的操作有两个获取(acquire)和释放(release),其中每个操作有对应的一些扩展方法,比如超时、共享锁、可中断等。获取独占锁 public final void...

2018-12-18 13:28:44 225

原创 @Async

在开发过程中,我们有很多的业务场景都会遇到使用线程池的情况,例如定时任务使用的就是ScheduledThreadPoolExecutor。而有些时候使用线程池的场景就是会将一些可以进行异步操作的业务放在线程池中去完成,例如在生成订单的时候给用户发送短信,生成订单的结果不应该被发送短信的成功与否所左右,也就是说生成订单这个主操作是不依赖于发送短信这个操作,所以我们就可以把发送短信这个操作置为异步操作...

2018-11-27 20:57:04 4068

原创 Mysql中的事务隔离

Innodb的锁Record lock单条索引记录上加锁,record lock锁住的永远是索引,而非记录本身,行锁锁定的是索引记录,而不是行数据,也就是说锁定的是key。即使该表上没有任何索引,那么Innodb在后台创建一个隐藏的聚集主键索引,那么锁住的就是这个隐藏聚集主键索引。所以说当一条sql没有走任何索引的时候,那么将会在每一个条聚集索引后面加X锁,这个类似于表锁,但原理上和表锁应...

2018-11-26 17:15:53 207

原创 interrupt()方法

title:线程中断date:2017年11月4日23:02:38今天来看看线程中断的问题。当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以判断线程是否应该被中断...

2018-11-06 19:34:04 13090 2

原创 Synchronized关键字

title:synchronized关键字date:2017年10月30日22:18:19一.可内置重入锁每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或监视器锁。线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁。获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法。(当我们调用某对象的synchronized方法时,就获取了该对象的同步锁。)...

2018-11-06 18:02:06 121

原创 字符集与字符编码

首先,我们要明确最基本的一点就是计算机的最小存储单位是字节(1byte=8bit)字符集1.什么是字符字符是各种文字和符号的总称,包括各个国家文字标点符号,图形符号,数字等。2.字符集首先,我们可以说一句废话,字符集是字符的集合。将一些特定的汉字,符号,字母收入到一个标准中,这些遵循同个标准的字符集合就称为字符集。常见字符集有Unicode字符集,ASCII字符集,ISO 8859字...

2018-11-05 17:14:15 204

原创 GIT

GIT 查看config配置信息查看系统configgit config --system --list查看当前用户配置信息git config --global --list查看当前仓库配置信息git config --local --list创建一个本地分支,并关联对应的远程分支git checkout --track branchname--- e...

2018-11-05 15:19:22 176

原创 Linux命令行

查询某一文件target file中某个字符串str出现的次数使用grep命令cat targetfile | grep 'str' | wc -l 使用awk工具待续sed命令sed:是一个编辑器,是一个强大的文件处理工具。sed作用:用来替换、删除,更新文件中的内容。 sed能自动处理一个或多个文件。sed命令详解grep命令查某个字符串出现的前后n行cat...

2018-11-05 15:17:32 305

原创 跨域问题总结

前言在如今流行前后端分离开发的时代,我们在PC浏览器端经常会遇到CORS跨域问题。那么今天就结合开发中遇到的问题来对跨域做一个总结。preflight request 预请求之前的后端接口只和微信小程序对接,如今需要接入H5,PC版本。 然后在前端页面出现了Request header field stoken is not allowed by Access-Cont...

2018-09-14 11:03:59 318

原创 CAP

前言在学习Zookeeper相关知识的时候,了解到了CAP理论。即在分布式系统中,不可能同时满足以下三种一致性(C:Consistency)可用性(A:Available)分区容错性(P:Partition Tolerance)这三个基本需求,最多只能同时满足其中的两项,因为P是必须的,因此往往选择就在CP或者AP。 理论简单的阐述就是这些,但是仅仅是知道这些,其实是没有真正...

2018-08-30 17:39:13 2436

原创 Broken Pipe

Broken Pipe发生的原因当某个进程试图往一个已收到RST的SOCKET连接写数据,就会出现Broken Pipe。 (由于TCP协议层已经处于RST状态了,因此不会将数据发出,而是发一个SIGPIPE信号给应用层,SIGPIPE信号的缺省处理动作是终止程序。)那么确定什么时候TCP会发送RST报文段,就可以确定Broken Pipe发生的具体原因。之前已经分析了TCP RST...

2018-08-14 17:52:48 4025

转载 TCP的RST报文

我们知道TCP建立连接的时候需要三次连接,TCP释放连接的时候需要四次挥手,在这个过程中,出现了很多特殊的标志报文段,例如SYN ACK FIN,在TCP协议中,除了上面说了那些标志报文段之外,还有其他的报文段,如PUSH标志报文段以及今天需要重点讲解的RST报文段。RST:(Reset the connection)用于复位因某种原因引起出现的错误连接,也用来拒绝非法数据和请求。如果接收到R...

2018-08-14 17:46:07 12188

转载 TCP握手和挥手

建立TCP链接,三次握手第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第...

2018-08-14 16:51:28 201

原创 Socket学习

前言慢慢的完善下阅读了Tomcat源码后遗留下的问题,今天主要解决Socket。Socket相关知识预热在讲Socket之前,我们需要了解一些知识TCP/IP计算机网络五层结构我们大学的时候都学过计算机网络(惭愧,那门课的知识基本都还给老师了),当时课本就讲述了两种主流的计算机网络分层结构,其中就包括我们现在要说的TCP/IP五层结构,另一个就是OSI七层结构,我们今天先不说。物理层中继器、集线

2018-02-27 21:55:46 416

转载 乐观锁-CAS

前言观锁资料:http://www.cnblogs.com/wang-meng/p/5506943.html悲观锁在关系数据库管理系统里,悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)是一种并发控制的方法。它可以阻止一个事务以影响其他用户的方式来修改数据。如果一个事务执行的操作都某行数据应用了锁,那只有当这个事务把锁释放,其他事务才能够

2018-02-26 01:12:16 516

原创 Spring事务管理之AOP方法

使用AOP完成Spring事务管理 <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="get*" read-only="true" propagation="REQUIRED" />

2018-02-06 23:24:51 588

原创 Spring事务实现之编程式事务

编程式事务(TranscationTemplate)废话不多说,直接看配置文件。<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns

2018-02-06 23:24:26 838

原创 Spring事务管理

数据库事务四大特性原子性(Atomicity)​ 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。一致性(Consistency)  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必

2018-02-06 23:24:02 268

castor 学习文档英文原版

castor 帮助文档 Castor API Documentation

2017-06-06

空空如也

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

TA关注的人

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