- 博客(39)
- 资源 (5)
- 收藏
- 关注

原创 SpringBoot使用AOP完成多数据源切换
基于上个项目完成数据源配置。1、修改pom.xml文件,加入AOP和Processor<!-- AOP --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId...
2018-09-29 22:17:07
4382
4
原创 BASE理论
BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的缩写。BASE理论是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结, 是基于CAP定理逐步演化而来的。BASE理论的核心思想是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。
2024-12-09 21:09:35
292
原创 synchronized、volatile区别
这里从哪读取我并不明确,一般来说应该是先在进行修改的缓存A中修改为新值,然后通知其他缓存清除掉此变量,当其他缓存B中的线程读取此变量时,会向总线发送消息,这时存储新值的缓存A获取到消息,将新值传给B。当变量需要更新时都是此步骤,volatile的作用是被其修饰的变量,每次更新时,都会刷新上述步骤。如果缓存在处理器的缓存行中,内存区域在LOCK操作期间被锁定,当它执行锁操作,回写主内存时,处理器不在总线锁上声言LOCK#信号,而是修改内部内存地址,并允许它的缓存一致性机制来保证操作的原子性。
2024-11-25 22:04:22
647
原创 轻量级锁的理解
轻量级锁是指当锁是偏向锁的时候,却被另外的线程所访问,此时偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁(CAS),线程不会阻塞,从而提高性能。
2024-11-24 15:45:24
303
原创 偏向锁的理解
偏向锁是指当一段同步代码一直被同一个线程所访问时,即不存在多个线程的竞争时,那么该线程在后续访问时便会自动获得锁,从而降低获取锁带来的消耗,即提高性能。
2024-11-19 22:16:12
284
原创 乐观锁的一种实现方式-CAS
CAS是一项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。
2024-11-18 20:59:42
466
原创 ReentrantLock的具体实现细节是什么
在 JDK 1.5 之前共享对象的协调机制只有 synchronized 和 volatile,在 JDK 1.5 中增加了新的机制 ReentrantLock,该机制的诞生并不是为了替代 synchronized,而是在 synchronized 不适用的情况下,提供一种可以选择的高级功能。
2024-11-17 20:18:51
862
原创 AbstractQueuedSynchronizer
AbstractQueuedSynchronizer本质是一个队列(Queue),其内部维护着FIFO的双向队列,也就是CLH队列。/*** The synchronization state. 使用的是volatile修饰* state变量表示锁的状态* 0 表示未锁定* 大于0表示已锁定* 需要注意的是,这个值可以用来实现锁的【可重入性】,例如 state=3 就表示锁被同一个线程获取了3次,想要完全解锁,必须要对应的解锁3次* 同时这个变量还是用volatile关键字修饰的,保证可见性。
2024-11-15 22:24:07
946
原创 线程的状态有哪些?它是如何工作的?
首先先要创建线程并指定线程需要执行的业务方法,然后再调用线程的 start() 方法,此时线程就从 NEW(新建)状态变成了 RUNNABLE(就绪)状态,此时线程会判断要执行的方法中有没有 synchronized 同步代码块,如果有并且其他线程也在使用此锁,那么线程就会变为BLOCKED(阻塞等待)状态,当其他线程使用完此锁之后,线程会继续执行剩余的方法。run() 方法为 Runnable 的抽象方法,必须由调用类重写此方法,重写的 run() 方法其实就是此线程要执行的业务方法。
2024-11-14 21:55:08
736
原创 volatile、ThreadLocal的使用场景和原理
java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。当线程没有结束,但是ThreadLocal已经被回收,则可能导致线程中存在ThreadLocalMapnull, Object>的键值对,造成内存泄露。虽然ThreadLocal的get,set方法可以清除ThreadLocalMap中key为null的value,但是get,set方法在内存泄露后并不会必然调用,所以为了防止此类情况的出现,我们有两种手段。示例2(Session管理)
2024-11-13 21:50:24
781
原创 Java多线程内存模型
锁的内存语义:当线程释放锁时,JVM会将该线程的本地内存中的共享变量刷新到主内存中 获取锁的内存语义:当线程获取锁时,JVM会将该线程的本地内存设置为无效,从而使被监听器保护的临界区代码必须从主内存中读取共享变量。线程之前的共享变量存储在主内存中,每个线程有一个私有的本地内存(工作内存),本地内存(工作内存)存储的是该线程以读写的共享变量副本。写的内存语义:当写一个volatile变量时,JVM会将该线程的本地内存中的共享变量刷新到主内存中。可见性:读取一个变量的值,可以立即看到其他线程对此变量的修改。
2024-11-11 21:48:32
314
原创 双亲委派模型的破坏
为了解决这个困境,Java设计团队只好引入了一个不太优雅的设计:线程上下文件类加载器(Thread Context ClassLoader)。这个类加载器可以通过java.lang.Thread类的
2024-11-08 23:06:11
400
原创 ClassLoader加载类的原理
ClassLoader使用的是双亲委托模型来搜索类的,每个ClassLoader实例都有一个父类加载器的引用(不是继承的关系,是一个包含的关系),虚拟机内置的类加载器(Bootstrap ClassLoader)本身没有父类加载器,但可以用作其它ClassLoader实例的的父类加载器。
2024-11-08 23:05:02
811
原创 线程池核心参数有哪些
当线程数>=corePoolSize,且任务队列已满时。线程池会创建新线程来处理任务。当线程池的核心线程都在处理任务时,如果来了新的任务就会被缓存到任务队列中排队等待执行。当线程数=maxPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常。7、rejectedExecutionHandler:指定线程池拒绝策略。6、threadFactory:线程的创建工厂。3、keepAliveTime:线程存活时间。5、workQueue:线程池执行的任务队列。4、unit:存活时间单位,
2024-11-06 21:22:59
411
原创 为什么要创建线程池?创建线程池的方式有哪些
java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现用于创建线程池一个线程池包括以下四个基本组成部分:1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;2、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;
2024-11-05 21:13:29
318
原创 创建线程的几种方式
(4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。(1)Callable规定的方法是call(),Runnable规定的方法是run().(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得。(3)call方法可以抛出异常,run方法不可以。Runnable和Callable的区别是,
2024-11-05 21:10:15
204
原创 ThreadLocal什么时候会出现OOM的情况?如何避免
比较两种情况,我们可以发现:由于ThreadLocalMap的生命周期跟Thread一样长,如果都没有手动删除对应key,都会导致内存泄漏,但是使用弱引用可以多一层保障:弱引用ThreadLocal不会内存泄漏,对应的value在下一次ThreadLocalMap调用set、get、remove的时候会被清除。(2)key 使用弱引用:引用的ThreadLocal的对象被回收了,由于ThreadLocalMap持有ThreadLocal的弱引用,即使没有手动删除,ThreadLocal也会被回收。
2024-11-03 20:35:09
371
原创 Java中对象的创建过程
首先代码中new关键字在编译后,会生成一条字节码new指令,当虚拟机遇到一条字节码new指令时,会根据类名去方法区运行时常量池找类的符号引用,检查符号引用代表的类是否已加载,解析和初始化过。如果垃圾收集器是CMS这种基于清除算法的收集器时,Java堆中的空闲内存和已使用内存是相互交错的,虚拟机会维护一个列表,记录哪些可用,哪些不可用,分配时从表中找到一块足够大的空闲内存分配给实例对象,并且更新表。在构造一个类的实例对象时,遵循的原则是先父后子,先静后动,先变量,后代码块,再构造器。
2024-11-03 20:33:21
153
原创 Java线程CPU占用过高如何排查?
使用排查命令可以找到占用CPU过高的线程,根据线程堆栈信息可以分析线程的运行情况,找到占用CPU过高的原因。
2024-10-31 21:22:53
537
原创 Java内存区域(运行时数据区域)怎么划分的?
程序计数器存储了当前线程正在执行的字节码指令的地址(如果是当前执行的是Native方法,那么计数器为空),字节码解释器就是通过改变计数器的值来选取下一条需要执行的字节码指令。存储了被虚拟机加载的类型信息,常量,静态变量等数据,在JDK1.8以后,存储在元空间中(以前是存储在堆中的永久代中,JDK8以后已经没有永久代了)。本地方法栈与Java虚拟机栈类似,只不过是执行Native方法(C++方法等),在HotSpot虚拟机中直接把本地方法栈与虚拟机栈二合一。3、线程共享的部分(堆,方法区)
2024-10-31 21:22:10
703
原创 JVM垃圾回收算法
但是在JVM中会很难解决对象之间相互循环引用的问题,就如果两个对象之间相互调用,这时候就会发生类似死锁的情况,即这个地方相互调用会使得引用计数法始终认为有对象在引用当前对象,就一直计数值大于或等于1,也就无法通知GC收集器回收它们。使用一系列的GC Roots的对象(包括:虚拟机栈中引用的对象,本地方法栈中JNI引用的对象,方法区中类静态属性引用的对象,方法区中常量引用的对象)作为起点,从节点开始向下搜索,当没有被GCRoots链接到的对象就可以回收,如下图的对象4和5就判断为可回收对象。
2024-10-29 21:25:25
1841
原创 ClassLoader加载类的原理
当一个ClassLoader实例需要加载某个类时,它会试图亲自搜索某个类之前,先把这个任务委托给它的父类加载器,这个过程是由上至下依次检查的,首先由最顶层的类加载器Bootstrap ClassLoader试图加载,如果没加载到,则把任务转交给Extension ClassLoader试图加载,如果也没加载到,则转交给App ClassLoader 进行加载,如果它也没有加载得到的话,则返回给委托的发起者,由它到指定的文件系统或网络等URL中加载该类。但是,如果基础类又要调用用户的代码,那该怎么办呢。
2024-10-29 21:23:09
878
原创 java.lang.NoClassDefFoundError: org/springframework/core/annotation/AnnotatedElementUtils
使用spring做单元测试时,启动时报错:java.lang.NoClassDefFoundError: org/springframework/core/annotation/AnnotatedElementUtils解决方式如下:把 spring-core 版本号升级到4.2.5.RELEASE及以上,原因是:较旧版本的 spring-core 库正通过 spring-asm 加载为传递依赖项。参考:https://stackoverflow.com/questions/35942232/spri
2020-07-28 23:04:42
540
原创 SpringBoot集成PageHelper实现分页
1、修改的pom.xml的文件,增加PageHelper<!--分页PageHelper --><dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId>...
2018-11-02 17:50:37
350
原创 SpringBoot解决跨域问题与session不一致问题
一,后端解决跨域问题的两种方式1,解决局部跨域问题(1)在Controller上加@CrossOrigin注解:所有方法都是可跨域(2)在方法上加@CrossOrigin注解:只对某个方法可跨域2,解决全局跨域问题@Configurationpublic class WebCrossOrigin { @SuppressWarnings({ "rawtypes",...
2018-09-20 15:27:15
7845
1
原创 SpringBoot集成Mybatis和Druid连接池
1、建立一张学生表及对应的学生信息实体类CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `age` int(11) DEFAULT NULL, `class_number` int(10) DEFAULT NULL, PRIMAR...
2018-09-16 21:39:16
2867
原创 SpringBoot基础入门
1、打开浏览器输入 start.spring.io网址,填写如下信息,下载到本地并解压2、删除如图所选中的三个文件3、打开Eclipse工具,导入刚才解压好的项目,项目结构如下:4、在demo文件夹下写一个TestController.javapackage com.example.demo;import org.springframework.web.bind....
2018-09-16 19:01:26
157
转载 Base64编码与图片互转工具
package com.willdas.test;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import ja
2016-11-02 00:20:47
137069
原创 json转换工具
/** * @功能描述:json转换工具类 */public class JsonUtil{privatestatic final Log logger = LogFactory.getLog(JsonUtil.class);// 日志 publicstatic List jsonToObj(String json, Class clazz) {Listlist
2016-08-15 22:22:25
529
1
原创 Http请求辅助工具HttpClient
/** * @功能描述:http请求辅助工具 */@Componentpublic class HttpUtil{privateLog logger = LogFactory.getLog(getClass());// 日志 /** * @功能描述:http执行get方法 */publicString get(String url) {Stringtex
2016-08-15 21:49:22
363
原创 json格式转换工具包
public class JsonUtil{privatestatic final Log logger = LogFactory.getLog(JsonUtil.class);// 日志publicstatic List jsonToObj(String json, Class clazz) {Listlist = null;ObjectMappermapper = new O
2016-08-15 21:27:47
3923
原创 XML的3种解析方式
Dom4j解析(1) Dom4j //创建解析器SAXReader saxReader = newSAXReader();//通过解析器的read方法将xml文件 读取到Document对象Document doc =saxReader.read("要读取的.xml");//获取XML文件的根节点:studentsElement root = doc.getRoot...
2016-05-22 15:14:26
362
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人