- 博客(27)
- 收藏
- 关注
原创 自定义ArcheType
找一个原型项目,需要有项目的标准结构确保项目编译无误:此命令将项目转换为 Archetype,并在 target/generated-sources/archetype 目录中生成 Archetype 的源码,最核心的部分就在于怎么修改target/generated-sources/src/main/resources/archetype-resources下的文件删除无用的。
2025-03-21 17:57:38
429
原创 DataSourceClosedException_ dataSource already closed
程序启动时,开启了一个线程池去一直循环修改数据库表数据,不会停下,于是在程序启动失败的时候数据库连接池关闭了,但是一直在报错: dataSource already closed。,这也就解释了为什么后面一直报错: dataSource already closed,因为服务启动失败了数据连接池关闭了,但是为什么控制台一直在刷?注入失败了,程序启动失败了,但是因为在程序启动的时候在程序中开启了非守护线程,且一直在运行,在。等,那么这些被开启的线程就会一直运行,JVM因为这些非守护线程在执行也不会退出。
2024-12-23 00:15:06
696
原创 AQS 原理
全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁getState - 获取 state 状态setState - 设置 state 状态compareAndSetState - cas 机制设置 state 状态独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问资源。
2024-12-16 23:18:51
187
原创 AQS 原理
全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁getState - 获取 state 状态setState - 设置 state 状态compareAndSetState - cas 机制设置 state 状态独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问资源。
2024-12-04 06:00:00
296
原创 JMM之可见性与有序性
分析:【从Java内存模型的角度出发进行分析,Java内存模型就是把Java内存划分为主存和工作内存,主存就是所有共享信息存储的位置,工作内存就是每个线程私有的信息存储位置】
2024-12-03 23:05:48
786
1
原创 多线程设计模式
保护性暂停主要是解决什么问题?用在一个线程等待另一个线程的执行结果(交互结果)有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject如果有结果不断从一个线程到另一个线程那么可以使用消息队列(生产者/消费者模式)JDK 中,join 的实现、Future 的实现,采用的就是此模式因为要等待另一方的结果,因此归类到同步模式与前面的保护性暂停中的 GuardObject 不同,不需要产生结果和消费结果的线程一一对应。
2024-12-03 23:05:18
1155
原创 数据库分库分表
首先,Mycat是一个MySQL数据库中间件,是开源的、活跃的、基于Java语言编写的。我们可以像使用mysql一样来使用mycat,对于开发人员来说根本感觉不到mycat的存在。开发人员只需要连接MyCat即可,而具体底层用到几台数据库,每一台数据库服务器里面存储了什么数 据,都无需关心。具体的分库分表的策略,只需要在MyCat中配置即可,其概念有点类似于我们使用的ngnixMycat支持分片规则。
2024-12-03 23:04:44
987
原创 正确处理执行任务异常
在 Java 中,使用 ExecutorService 提交的任务(通过 submit 方法),如果抛出异常,通常这些异常不会直接打印到控制台。这是因为异常被封装在了返回的 Future 对象中,除非你主动去查询这个 Future 对象,否则异常不会被输出。在上述代码中,提交了一个 lambda 表达式作为一个任务到单线程的线程池中。如果这个任务抛出一个异常,它将会被捕获并且被存储在与任务关联的 Future 中。要获取异常,需要调用 Future.get() 方法。
2024-12-03 23:03:09
199
原创 wait_notify park_unpark
obj.wait() 让进入 object 监视器的线程到 waitSet 等待obj.notify() 在 object 上正在 waitSet 等待的线程中挑一个唤醒obj.notifyAll() 让 object 上正在 waitSet 等待的线程全部唤醒它们都是线程之间进行协作的手段,都属于 Object 对象的方法。必须获得 Object 对象的锁,才能调用这几个方法log.debug("执行....");// 让线程在obj上一直等待下去。
2024-12-03 23:02:33
566
原创 JAVA 线程池
FunctionalInterface // 拒绝策略,在队列满时执行的策略// 1. 任务队列,双向链表,ArrayDeque 的性能比 LinkedList较好// 2. 锁,防止一个任务被多个线程获取 & 防止多个生产者同时生产任务造成任务丢失// 3. 生产者条件变量// 4. 消费者条件变量// 5. 容量// 带超时阻塞获取try {// 将 timeout 统一转换为 纳秒try {// 返回值是剩余时间return t;
2024-12-03 23:01:59
672
原创 JMM之可见性与有序性
分析:【从Java内存模型的角度出发进行分析,Java内存模型就是把Java内存划分为主存和工作内存,主存就是所有共享信息存储的位置,工作内存就是每个线程私有的信息存储位置】
2024-12-03 23:01:12
790
原创 不可变对象
英文名称:Flyweight pattern. 当需要重用数量有限的同一类对象时享元模式在包装类中的体现static {i++)Byte, Short, Long 缓存的范围都是 -128~127Character 缓存的范围是 0~127Integer的默认范围是 -128~127 最小值不能变 但最大值可以通过调整虚拟机参数 `` -Djava.lang.Integer.IntegerCache.high来改变Boolean 缓存了 TRUE 和 FALSE。
2024-12-03 23:00:17
632
原创 CAS实践
如果另一个线程也调用 withdraw 方法,它可能会在第一个线程完成余额更新之前读取和修改余额,导致两个线程看到的是同一个初始余额,并基于这个相同的值执行减法操作,最终导致余额减少的总量小于应有的数额。的场景下(为什么适用于多核CPU, 因为无锁情况下,线程要保持运行(一直while),需要额外 CPU 的支持,CPU 在这里就好比高速跑道,没有额外的跑道,线程想高速运行也无从谈起,虽然不会进入阻塞,但由于没有分到时间片,仍然会进入可运行状态,还是会导致上下文切换)给 Account 对象加锁。
2024-12-03 22:58:48
848
原创 原子类相关
但是有时候,并不关心引用变量更改了几次,只是单纯的关心是否更改过,所以就有了 AtomicMarkableReference。使用 AtomicReference 时线程仅能判断出共享变量的值与最初值 A 是否相同,不能感知到从 A 改为 B 又改回 A 的情况,如果主线程 希望: 只要有其它线程【动过了】共享变量,那么自己的 cas 就算失败,这时,仅比较值是不够的,需要再加一个版本号,使用 AtomicStampedReference 可以实现。Student(id=20, name=张三)
2024-12-03 22:50:18
911
原创 Fork_Join
提交给 Fork/Join 线程池的任务需要继承 RecursiveTask(有返回值)或 RecursiveAction(没有返回值),例如下面定义了一个对 1~n 之间的整数求和的任务。所谓的任务拆分,是将一个大任务拆分为算法上相同的小任务,直至不能拆分可以直接求解。Fork/Join 在分治的基础上加入了多线程,可以把每个任务的分解和合并交给不同的线程来完成,进一步提升了运算效率。Fork/Join 是 JDK 1.7 加入的新的线程池实现,它体现的是一种分治思想,适用于能够进行任务拆分的。
2024-12-03 22:46:27
314
原创 Junit5 单元测试入门
doReturn().when() 结构可以用在 mock 的方法在调用时抛出异常的情况下,而 when().thenReturn() 结构不能。,doReturn().when() 结构不能用,需要使用 doNothing().when(mock).method(),doThrow().when(mock).method() 或 doAnswer().when(mock).method() 等结构。或:doCallRealMethod().when(mockObject).method();
2024-12-03 22:45:33
790
原创 ReentrantLock 原理
如果 Thread-1 此时没获取到锁正在阻塞中,其他线程调用 interrupt 打断 Thread-1,此时 Thread-1 开始向下运行,开始运行第 9 行,第 9 行返回 true,同时清除打断标记,让下一次 LockSupport.park(this);执行 transferForSignal 流程,将该 Node 加入 AQS 队列尾部,将 Thread-0 的 waitStatus 改为 0,Thread-3 的 waitStatus 改为 -1。park 阻塞 Thread-0。
2024-12-03 22:29:05
906
原创 Synchronized原理
Java 对象的大小与操作系统的位数有关。我们程序中加锁时,每个对象会关联一个Monitor,Monitor是真正的锁,它由操作系统提供,使用成本较高,从Java6开始对synchronized获取锁的方式进行了改进,从直接使用Monitor锁改成了可以使用轻量级锁、偏向锁进行优化…轻量级锁的使用场景:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争,如果有竞争轻量级锁会升级为重量级锁),那么可以 使用轻量级锁来优化,轻量级锁不需要monitor锁,使用线程栈帧中的锁记录充当轻量级锁。
2023-12-30 11:09:36
886
1
原创 Spring循环依赖学习笔记
假设这里只有一级和三级缓存的话,我每次从三级缓存中拿到singleFactory对象,执行singleFactory.getObject()方法都会生成一个新的代理对象,这是不行的,因为TestServiceB是单例的,所有这里我们要借助二级缓存来解决这个问题,将执行了singleFactory.getObject()产生的对象放到二级缓存中去,后面去二级缓存中拿,没必要再执行一遍singletonFactory.getObject()方法再产生一个新的代理对象,保证始终只有一个代理对象。...
2022-08-06 23:19:49
148
原创 关于ZipKin没有正确拦截RestTemplate请求
问题有服务A调用服务B调用服务C,A->B B-C 使用RestTemplate但是在ZipKin服务端的结果是三次分别的请求:解决办法zipkin就是通过spring拦截了RestTemplate的创建,使其可以拦截restTemplate的invokeUrl方法,实现日志收集。@autowired声明后,spring将会管理这个对象的生命周期,就可以在这个对象创建的前后放入钩子(拦截器)对其进行处理因此,我们在使用RestTemplate的时候,不能直接new RestTemplat
2022-04-17 02:53:39
523
原创 Java Bean线程问题
源码1.controller类@RestController//@Scope(value = "prototype")public class SpringBeanController { @RequestMapping("say") public String sayHello(){ return "Hello Spring Boot"; } private int var = 0; // 定义一个普通变量 private static
2022-03-05 01:03:58
289
1
原创 Java IO流
Java IO 流IO流类结构图IO流的分类转换流缓冲流IO流类结构图IO流的分类按数据流向:输入流和输出流输入和输出都是从程序的角度来说的输入流:数据流向程序输出流:数据从程序中流出从磁盘、网络、键盘读到内存,就是输入流。用InputStream或Reader写到磁盘、网络、显示器,就是输出流。用OutputStream或Writer按处理单位:字节流和字符流字节流:一次读入或读出是8位二进制字符流:一次读入或读出是16位二进制JDK中后缀是Stream是字节流,后缀是
2022-02-14 23:33:47
313
原创 Bmob中BmobQuery查询数据后将值传递给全局变量
Bmob中BmobQuery查询数据后将值传递给全局变量刚开始接触Bmob时,通过BmobQuery查询的数据无法赋值给全局变量,通过网上查资料得知Bmob的查询操作是异步线程,异步线程中的值无法直接赋给全局变量!有些大佬通过Handler+message的方法可以实现,我借鉴了一下,但是没成功,也找不到BUG。后来了解到可以使用接口回调,于是一番搜索后,终于得以实现。这里记录一下这里我主要是...
2020-02-19 18:32:56
1779
11
原创 Android语音控制录音APP——根据音量大小自动记录
Android语音控制录音APP——根据音量大小自动记录继参考了很多采集环境音量大小的博客,最后采用这位博主的计算方式,采集出来的音量很稳定关于Android、ios录音时音量大小的计算##点击“开始”按钮,开始录制public void startRecord() { flag = false; Log.d("AudioRecorder","======开...
2019-06-26 19:17:26
1160
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人