摘要:
## 什么是SPI SPI是jdk中的一种服务发现机制,在java中可以用来扩展API和第三方实现。相比于API,可以动态替换发现。 * 我的理解: SPI是一种动态服务发现方式。如果我们想要调用别人实现的方法,那么肯定是调用别人的实现类来操作。但是java里面是面向接口编程,实现多个类之间的解耦。 阅读全文
摘要:
## 源头 最近线上出现了锁表,一个查询大表的sql语句居然执行了好几个小时,然后其他的sql语句去操作大表,然后运维人员提示出现了锁表问题。 ## 什么情况下会出现锁表 * 锁表一般发生在insert、delete、update语句中。 * insert、update、delete等语句操作表,使 阅读全文
摘要:
## 源头 最近项目中想要实现一个功能,根据一个统计的java模版,统计的参数基本初始化都为0,针对每次不同的查询条件,查询出来的不同记录,然后修改部分值,但是发现每次查询出来的不同记录会影响到模版类数据的变化。 ## 问题复现 ``` /** * 统计不同部门人数 */ @Data public 阅读全文
摘要:
源头 最近一直在看多线程和并发的知识,然后也看了线程池、阻塞队列等源码,想要造个轮子,来加深对阻塞队列源码的理解。 思路 阻塞队列的实现思路还是利用等待/唤醒机制的思路。 队列的实现使用双向链表LinkedList实现,因为队列是后进先出保证公平性,所以存元素就插入到队列的尾部,而取元素就从队列的头 阅读全文
摘要:
## BlockingQueue介绍 * ArrayBlockingQueue: 一个由数组结构组成的有界阻塞队列。 * LinkedBlockingQueue: 一个由链表结构组成的有界阻塞队列。 * SynchronousQueue: 一个不存储元素的阻塞队列。 * PriorityBlocki 阅读全文
摘要:
## 思路 * 思路1,利用中断标志关闭线程 * 思路2,利用volatile标识变量,线程间可见性共享。 ## 实现1,利用中断关闭线程 ``` public class DemoTest { public static void main(String[] args) throws Interr 阅读全文
摘要:
## 多线程下的共享变量的问题 1. 多个线程操作同一变量数据,是否会看到变化的数据。 2. 多个线程执行同一段程序,会不会中间插手,造成脏数据(多数情况下,我们通过加锁的形式来保证一段程序一个时间段只有一个线程执行)。 3. 多线程操作时,编译器出于性能考虑,采取指令重排序(处理器的乱序执行),导 阅读全文
摘要:
## 生产者和消费者模式的来源 生产者指的是生产数据的线程,消费者是消费数据的线程。在多线程开发中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这种生产能力和消费能力不均衡 阅读全文
摘要:
为什么要使用自动装配 为了简化配置,向SpringBoot问世前,一般都使用XML的方式来配置bean,而非常臃肿的配置文件,配置不方便。而SpringBoot提出了约定大于配置,所以通过约定大于配置的方式来加载不同的bean。 自动装配过程 加载BeanFactory后置处理器,createApp 阅读全文
摘要:
## Shell实现输入数组,排序 ``` read -a arr echo "input arr ("${arr[@]}")" for ((i=0;i<${#arr[@]};i++)) do for ((j=i+1;j<${#arr[@]};j++)) do if (( ${arr[j]}<${a 阅读全文