自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 SpringBoot启动

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

2019-01-11 16:13:33 131 0

原创 SpringBoot Jar启动

SpringBoot项目的启动 当我们在IDE中新建(或导入)了一个SpringBoot项目之后,我们如果想要启动这个SpringBoot项目,我们可以找到相应的带有@SpringBootApplication注解的启动类,该启动类是一个带有main方法的类,这个类就是SpringBoot项目的入...

2019-01-11 16:13:00 506 0

原创 Spring Task

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

2018-12-25 17:03:32 1049 0

原创 线程池

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

2018-12-25 16:15:27 99 0

原创 两条实用的sql语句

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

2018-12-24 19:38:12 101 0

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

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

2018-12-24 18:21:11 91 0

原创 SimpleDateFormat线程安全问题

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

2018-12-24 15:46:35 77 0

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

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

2018-12-21 15:58:44 4536 2

原创 消息转换器

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

2018-12-21 15:58:15 268 0

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

在讲解SpringMVC整体设计的时候,我们只分析了最顶层的核心接口,但是SpringMVC还有很多可以去探究的细节,还有很多我们可以扩展的接口,我们继续来深入学习SpringMVC。 在整体设计分析中,我们知道一个Web请求进来时依靠HandlerMapping来找到正确的Controller以...

2018-12-21 15:57:39 100 0

原创 git remote prune origin

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

2018-12-20 17:51:29 908 0

原创 @Async原理

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

2018-12-20 17:37:14 1607 0

原创 @Autowired

前言 最近在使用@Async注解进行异步操作的时候时,想过一下@Async注解的原理,这种需要@Enable*注解开启作用的注解,原理应该是大同小异。之前已经分析过了@Scheluded注解了,本以为这次看@Async注解会很轻松,但是还遇到了很多问题。 我们知道在调用带有@Async的方法的时候...

2018-12-20 17:09:00 82 0

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

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

2018-12-20 16:02:01 1909 0

原创 Java中的四种引用

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

2018-12-19 18:24:29 79 0

原创 finalize

前言 在总结Java中的4种引用的时候,在查找资料的时候,看到了有关于Object#finalize()方法的一些介绍,提到我们不应该在程序中使用finalize()方法,该方法不安全,低效,不要去使用finalize()去完成资源释放工作,而是使用虚引用完成对象回收前的资源释放工作。但是并没有给...

2018-12-19 15:58:10 57 0

原创 ThreadLocal引发的Bug

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

2018-12-19 10:39:44 232 0

转载 并发与并行的区别

如果某个系统支持两个或者多个动作(Action)同时存在,那么这个系统就是一个并发系统。如果某个系统支持两个或者多个动作同时执行,那么这个系统就是一个并行系统。并发系统与并行系统这两个定义之间的关键差异在于**“存在”**这个词。 在并发程序中可以同时拥有两个或者多个线程。这意味着,如果程序在单核...

2018-12-18 17:47:13 199 0

转载 ReentrantReadWriteLock

前言 之前分析了使用AQS实现的共享锁和独占锁,今天来分析一下ReentrantReadWriteLock,这个即使用了共享锁(读锁)又使用了独享锁(写锁)的类。 与Mysql中的S锁(共享锁,读锁)一样,ReentrantReadWriteLock中的读锁只允许继续加读锁,而不允许加写锁。 而写...

2018-12-18 17:29:51 113 0

原创 LimitLatch

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

2018-12-18 16:11:36 234 0

原创 CountDownLatch

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

2018-12-18 15:19:24 53 0

原创 ReentrantLock

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

2018-12-18 14:48:07 1632 0

原创 AQS

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

2018-12-18 13:28:44 95 0

原创 @Async

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

2018-11-27 20:57:04 2064 0

原创 Mysql中的事务隔离

Innodb的锁 Record lock 单条索引记录上加锁,record lock锁住的永远是索引,而非记录本身,行锁锁定的是索引记录,而不是行数据,也就是说锁定的是key。即使该表上没有任何索引,那么Innodb在后台创建一个隐藏的聚集主键索引,那么锁住的就是这个隐藏聚集主键索引。所以说当...

2018-11-26 17:15:53 57 0

原创 interrupt()方法

title:线程中断 date:2017年11月4日23:02:38 今天来看看线程中断的问题。 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。中断的结果线程是死亡、还是等待新的任...

2018-11-06 19:34:04 3368 0

原创 Synchronized关键字

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

2018-11-06 18:02:06 43 0

原创 字符集与字符编码

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

2018-11-05 17:14:15 77 0

原创 GIT

GIT 查看config配置信息 查看系统config git config --system --list 查看当前用户配置信息 git config --global --list 查看当前仓库配置信息 git config --local --list 创建一个本地分支,...

2018-11-05 15:19:22 57 0

原创 Linux命令行

查询某一文件target file中某个字符串str出现的次数 使用grep命令 cat targetfile | grep 'str' | wc -l 使用awk工具 待续 sed命令 sed:是一个编辑器,是一个强大的文件处理工具。 sed作用:用来替换、删除,...

2018-11-05 15:17:32 55 0

原创 跨域问题总结

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

2018-09-14 11:03:59 135 0

原创 CAP

前言 在学习Zookeeper相关知识的时候,了解到了CAP理论。即在分布式系统中,不可能同时满足以下三种 一致性(C:Consistency) 可用性(A:Available) 分区容错性(P:Partition Tolerance) 这三个基本需求,最多只能同时满足其中的两项,因为P...

2018-08-30 17:39:13 1244 0

原创 Broken Pipe

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

2018-08-14 17:52:48 1435 0

转载 TCP的RST报文

我们知道TCP建立连接的时候需要三次连接,TCP释放连接的时候需要四次挥手,在这个过程中,出现了很多特殊的标志报文段,例如SYN ACK FIN,在TCP协议中,除了上面说了那些标志报文段之外,还有其他的报文段,如PUSH标志报文段以及今天需要重点讲解的RST报文段。 RST:(Reset th...

2018-08-14 17:46:07 2986 0

转载 TCP握手和挥手

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

2018-08-14 16:51:28 97 0

原创 Socket学习

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

2018-02-27 21:55:46 240 0

转载 乐观锁-CAS

前言观锁资料:http://www.cnblogs.com/wang-meng/p/5506943.html悲观锁在关系数据库管理系统里,悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)是一种并发控制的方法。它可以阻止一个事务以影响其他...

2018-02-26 01:12:16 352 0

原创 Spring事务管理之AOP方法

使用AOP完成Spring事务管理 <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> ...

2018-02-06 23:24:51 340 0

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

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

2018-02-06 23:24:26 433 0

原创 Spring事务管理

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

2018-02-06 23:24:02 127 0

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