自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring Task

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

2018-12-25 17:03:32 1678

原创 线程池

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

2018-12-25 16:15:27 270

原创 两条实用的sql语句

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

2018-12-24 19:38:12 255

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

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

2018-12-24 18:21:11 269

原创 SimpleDateFormat线程安全问题

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

2018-12-24 15:46:35 308

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

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

2018-12-21 15:58:44 11630 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 1032

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

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

2018-12-21 15:57:39 346

原创 git remote prune origin

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

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

原创 @Async原理

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

2018-12-20 17:37:14 21587

原创 @Autowired

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

2018-12-20 17:09:00 340

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

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

2018-12-20 16:02:01 3988

原创 Java中的四种引用

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

2018-12-19 18:24:29 201

原创 finalize

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

2018-12-19 15:58:10 211

原创 ThreadLocal引发的Bug

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

2018-12-19 10:39:44 729

转载 并发与并行的区别

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

2018-12-18 17:47:13 707

转载 ReentrantReadWriteLock

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

2018-12-18 17:29:51 258

原创 LimitLatch

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

2018-12-18 16:11:36 665

原创 CountDownLatch

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

2018-12-18 15:19:24 172

原创 ReentrantLock

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

2018-12-18 14:48:07 3005

原创 AQS

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

2018-12-18 13:28:44 258

castor 学习文档英文原版

castor 帮助文档 Castor API Documentation

2017-06-06

空空如也

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

TA关注的人

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