摘要:前言:之前有写过关于重入锁ReentrantLock的解析,而重入锁ReentrantLock的核心在于它的两个锁非公平锁和公平锁的所继承的父类AbstractQueuedSynchronizer,接下来就是关于AbstractQueuedSynchronizer的详解,包括图文、源码。后文Abst
阅读全文
摘要:前言:上一篇单线程池的随笔提到了非固定线程数的线程池,那么本文就以前文为基础,剖析Java线程池中的Executors.newCachedThreadPool()。Executors.newCachedThreadPool(),后文简称为缓存线程池。 ***Executors.newCachedTh
阅读全文
摘要:Java线程池Executors.newSingleThreadExecutor() 前言:本文先就Java线程池 ThreadPoolExecutor 进行分析,然后逐步分析单线程池的源码工作流程 ThreadPoolExecutor的工作流程 我们执行以下代码: ExecutorService
阅读全文
摘要:IO、NIO与Netty 前言:此文主要用于记录Netty学习之后的总结与笔记,较为浅显 Demo源码地址 1.BIO、NIO、AIO Java中有三种网络模型:BIO、NIO和AIO 1.1 BIO同步阻塞IO BIO就是Java IO包中的一系列流 import java.io.*; BIO作为
阅读全文
摘要:GC调优 参考:美团JVM调优文章 参数例子 java -jar -Xmx1024m -Xms1024m -Xmn256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/jvmlogs/ -XX:+UseParNewGC -XX:+Use
阅读全文
摘要:栈 什么是栈 栈又叫堆栈,是先入后出的数据结构 栈是线程私有的,不能互相访问的,栈随着线程的创建而创建,并且在编译时就已确定了栈的大小 栈通过栈帧保存了局部变量、对象的内存引用地址、操作栈、动态链接等等 栈帧 栈帧就是栈中的最小单位,第一个方法的调用就会生成栈帧,并将其压如栈中,就是压栈。 第一个方
阅读全文
摘要:SpringMVC的原理 加载的过程 关于加载,在SpringIOC的加载过程中,并不会直接将HandlerMapping等组件给加载进去,而是在第一次请求的时候,进行初始化 SpringMVC核心类,DispatcherServlet的类图 关于DispatcherServlet的初始化过程:由H
阅读全文
摘要:静态代理、动态代理和CGLIB 动态代理和CGLIB都是运行时构建代理对象,动态代理通过反射的方式,CGLIB通过java字节码织入继承父类的方式实现 静态代理 静态代理的核心在于,代理类和被代理的类实现同一个接口 public interface IUserService { void save(
阅读全文
摘要:重入锁ReentrantLock详解 ReentrantLock 实现自AQS队列同步器,其字面意思是可以重复进入的锁,其功能也如其名,在一个同步代码块中,可以多次调用 lock() 进行上锁,当然也需要对其进行多次解锁,才能使同步状态归0,其它线程才能重新获得锁。 重入锁又分为非公平锁和公平锁两种
阅读全文
摘要:前言:由于项目中有一些公共的属性需要初始化,例如创建人、创建时间等。考虑两种做法,一种是通过反射的方式实现,还有就是通过继承公共类的方式。两种方式各有利弊,反射对原有的类侵入性小,但是反射有效率问题,而继承公共类的话对类侵入性大,可维护性不太好。所以呢,想使用反射,然后测试一下反射的效率 publi
阅读全文
摘要:Spring的初衷 简化系统的复杂性; 使用依赖注入降低系统耦合度,减少开发者对对象的维护; 提供切面编程,将模块组件化,而非代码直接调用; 提供特定模块的模板,避免开发者写重复代码; 利于测试; Spring Bean的装配 三种装配方式:XML、JavaConfig、自动装配 XML通过XML文
阅读全文
摘要:CountDownLatch 简介原理 CountDownLatch是由队列同步器实现的。 在构建新的CountDownLatch对象时,需要传入一个大于0的整形int参数。而这个参数就作为队列同步器的state同步状态了。 public CountDownLatch(int count) { if
阅读全文
摘要:一、Lock接口 Lock接口提供了一些方法,比如lock(),tryLock()等方法,像ReentrantLock就是基于队列同步器来实现的 二、AbstractQueuedSynchronizer 1.什么是队列同步器 队列同步器是一个抽象类,提供了实现线程队列获取同步状态的一系列方法(简单理
阅读全文
摘要:. 1.1 init(初始化) 在第一次发出请求时,会调用HttpServletBean 的init()方法 org.springframework.web.servlet.HttpServletBean.init() //读取配置文件,初始化等操作 org.springframework.web.
阅读全文
摘要:. 一、解析xml: > org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream, java.lang.String, java.util.Properties) > org.apache.ibatis
阅读全文
摘要:前言: 常见的关于HahsMap与ConcurrentHashMap的问题: 数据结构、线程安全、扩容、jdk1.7 HashMap死循环、jdk1.8 HashMap红黑树、容量必须是2的冥次 HashMap 数据结构:数组,单向链表 线程安全:不安全,HashTable线程安全,但是全用了 sy
阅读全文
摘要:啥也不说先贴两个代码: 一:MVC层配置 二、关于数据层MyBatis需要配置pom新增依赖:
阅读全文
摘要:一、Application启动类添加注解 二、注入配置 三、缓存注解 四、清除缓存注解 更详细请参考: https://blog.csdn.net/dreamhai/article/details/80642010
阅读全文
摘要://根据排课id分组 Map<Integer, List<Schedule4Homework>> idSchedule4HomeworksMap = schedule4Homeworks.stream().collect(Collectors.groupingBy(Schedule4Homework
阅读全文
摘要:一、线程简介 1.线程的概念 系统运行的最小单元 2.为何使用多线程 更好地利用系统资源(处理器多核心),提高响应速度。 3.线程的状态 关于wait和notify: 结果: wait方法会释放锁,sleep则不会 二、启动和终止线程 1.启动线程 1.构建线程 注意:最好给线程初始化名称,方便JV
阅读全文