- 博客(31)
- 收藏
- 关注
原创 利用限流工具类RateLimiter实现限流的功能
引入依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>23.0</version> </dependency>创建测试Controllerimport com.googl
2020-07-28 23:49:16
1220
原创 利用springAOP+@Conditional注解拦截定时任务
由来正常在公司的项目中, 为了保证项目的可靠性, 同一个项目可能会部署到多台服务器上, 通常点说的话就是集群.那么, 在部署集群项目的时候. 定时任务的运行就是一个问题了. 我们只需要一台机器运行定时任务. 因此, 就需要把其他机器上的定时任务屏蔽掉. 那么, 就需要一个拦截定时任务的功能.创建一个定时任务启动类添加@EnableScheduling注解,开启定时任务功能创建一个每五秒执行一次的定时任务import lombok.extern.slf4j.Slf4j;import org.s
2020-07-25 01:55:24
1789
2
原创 springboot集成任务调度框架Quartz
首先搭建一个springboot项目然后, pom文件加上依赖 <!--quartz start--> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</vers
2020-07-22 23:27:17
324
原创 单线程业务升级为多线程的坎坷之路
优化业务流程 公司的一个老项目, 主要负责给商场生成各个商户的每月账单(比如租金, 管理费)之类的. 今天产品经理过来说, 月初的生成账单的定时任务要跑接近六个小时, 从上午五点一直跑到11点才结束. 这期间,商场的财务们无法对账单进行操作, 因为操作之后的账单可能会出现问题. 因此, 希望优化一下. 一直负责维护这项目的我自热而然的也就包揽下了这个任务.发现问题 我倒要看看是什么定时任务要跑六个小时. 经过一番查看, 发现定时任务中,大概有接近一千家商户, 也就是要生成接近一千个账单. 定时任
2020-07-10 02:09:42
512
原创 利用Jmeter进行接口并发测试
一、Jmeter简介Jmeter是由Apache公司开发的一个纯Java的开源项目,即可以用于做接口测试也可以用于做性能测试。Jmeter具备高移植性,可以实现跨平台运行。Jmeter可以实现分布式负载。Jmeter采用多线程,允许通过多个线程并发取样或通过独立的线程对不同的功能同时取样。Jmeter具有较高扩展性。Windows下安装JmeterJmeter下载地址因为Jmeter是用java编写的,因此要想使用必须要安装JDK,JDK的安装就不做赘述了下载成功后,解压到解压文件
2020-07-06 02:51:43
1920
原创 搭建springboot+mybatis+freemarker项目
1、首先,pom.xml文件添加依赖: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> </parent> <
2020-07-05 04:01:26
3852
1
原创 springboot集成Elasticsearch
什么是Elasticsearch?Elasticsearch是一个开源的分布式、RESTful 风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库——无论是开源还是私有,但它也仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理,因为Lucene 非常复杂。 为了解决Lucene使用时的繁复性,于是Elastic
2020-07-05 03:14:46
236
原创 双指针算法
141. 环形链表给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。示例 2:输入:head = [1,2], pos = 0输出:true解释:链表中有一个环,其尾部连接到第一个节点。示例 3:输入:head = [1], p
2020-05-28 00:57:04
149
原创 滑动窗口算法
1. 无重复字符的最长子串给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,
2020-05-28 00:46:11
201
原创 字符串编程题1
package java_core.string;import java.util.HashMap;import java.util.LinkedList;import java.util.Queue;import java.util.Stack;public class StringTest { public static void main(String[] args) { System.out.println(100%0);// System.ou
2020-05-22 00:46:18
468
1
原创 链表编程题
package java_core.Node;import java.util.*;/* 环形链表 141输入一个链表的头结点, 判断该链表是否是环形链表https://leetcode-cn.com/problems/linked-list-cycle/solution/huan-xing-lian-biao-by-leetcode/*/public class NodeTest { public static void main(String[] args) {
2020-05-17 23:25:09
231
原创 java对象的创建过程
当java虚拟机遇到一条字节码new指令时, 首先会去常量池中查找看能不能找到这个类的符号引用(), 并且检查这个类是否已经被加载,解析和初始化过; 如果没有,就会先执行相应的类加载过程.类加载检查通过之后,虚拟机将会为即将创建的对象分配内存. 即将创建的对象所需的内存大小在类加载完成之后就能确定; 给对象分配内存空间的过程其实就是相当于在java堆内存中划分出一块相同大小(对象所需的内存大小)的内存出来;而分配内存有两种方式:选择哪种方式由java堆内存是否规整(即已使用过的内存和未使用的内存放在两
2020-05-10 23:42:57
137
原创 java内存区域
1. 程序计数器2. 虚拟机栈线程私有; 每个方法被执行时,java虚拟机都会创建一个栈帧,栈帧用来存储局部变量表, 操作数栈, 动态连接, 方法出口等信息;每个方法执行的过程对应的就是一个栈帧从入栈到出站的过程;其中, 局部变量表包括基本数据类型和对象的引用;在方法运行时, 局部变量表所需要的空间是确定的,也就是说在方法运行期间, 并不会改变局部变量表的大小;如果线程请求的栈深度大于虚拟机所允许的深度,那么将会发生栈溢出异常(StackOverFlowError); 如果内存空间不足,也会出现内存
2020-05-10 21:48:45
97
原创 寻找数组的中心索引
给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法。我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。示例 1:输入:nums = [1, 7, 3, 6, 5, 6]输出: 3[-1,-1,-1,0,1,1]输...
2020-05-08 00:51:30
106
原创 轻松理解CAS算法
CAS算法CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有一个线程能更新变量的值,其它线程都会更新失败,但是更新失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,如果修改失败(即当前内存值与旧的预期值不一致), 则将预期值更新为最新的内存值,...
2020-05-07 00:20:34
585
原创 轻松理解java中的volatile关键字
volatile是什么?volatile是java中的一个关键字; 它可以用来修饰成员变量;被它修饰的变量可以保证可见性.什么是可见性?可见性是指多个线程访问同一个共享变量时, 如果某个线程对共享变量进行了修改, 那么其他线程读取到的必须是修改后的值.这就是可见性.先来看看常见的可见性问题:class Game extends Thread { public int index ...
2020-05-07 00:10:43
127
原创 轻松理解ThreadLocal的原理及应用场景
ThreadLocal是什么?ThreadLocal会给每个线程提供一个变量副本, 把共享变量的数据都拷贝到自己的变量副本中, 每个线程都只操作自己变量副本中的变量, 不会操作到主内存中的共享变量. 这样可以防止在并发的情况下,因其他线程对共享变量的修改而对当前线程造成影响.ThreadLocal的应用场景在Java的多线程编程中,为保证多个线程对共享变量的安全访问,通常会使用synchro...
2020-05-06 23:55:13
409
原创 多线程: 如何实现多个线程交替打印字符串?
编写一个可以从 1 到 n 输出代表这个数字的字符串的程序,但是:如果这个数字可以被 3 整除,输出 “fizz”。如果这个数字可以被 5 整除,输出 “buzz”。如果这个数字可以同时被 3 和 5 整除,输出 “fizzbuzz”。例如,当 n = 15,输出: 1, 2, fizz, 4, buzz, fizz, 7, 8, fizz, buzz, 11, fizz, 13, 14,...
2020-05-05 23:21:59
877
原创 多线程: 如何实现多个线程按序打印?
题目提供一个类public class Foo { private static void printA() { System.out.print("A"); } private static void printB() { System.out.print("B"); } private ...
2020-05-05 19:23:37
625
原创 Redis的数据结构及其应用场景
Redis的基本命令127.0.0.1:6379> set key aaa //设置键为key,值为aaaOK127.0.0.1:6379> get key //获取key值为key的值"aaa" 127.0.0.1:6379> exists key //判断key键是否存在(integer) 1127.0.0.1:6379> exp...
2020-05-04 04:51:24
188
原创 redis中的scan命令和keys命令
keys指令和scan指令 @Test public void testScan() { Set<String> keys = jedis.keys("*"); System.out.println(keys.toString()); int count = 3; ScanParams scanParams...
2020-05-04 03:03:38
3045
原创 你真的了解ArrayList和LinkedList么?
在面试的过程中, 经常会有面试官问道, ArrayList是什么,ArrayList和LinkedList有什么区别? 相信每个人都知道,ArrayList的底层是数组,LinkedList的底层是链表, LinkedList增删快,ArrayList查询快;它们两个都是线程不安全的; 而随着学习的深入,我们不能只知其然而不知其所以然; 我们要常常要问自己为什么. 为什么ArrayList查询快但...
2020-04-25 04:01:54
334
原创 轻松理解java读写锁ReentrantReadWriteLock的底层原理
锁降级的必要性:锁降级中读锁的获取是否必要呢?答案是必要的。首先, 主要是为了保证数据的可见性,如果当前线程不获取读锁而是直接释放写锁, 写锁释放之后可能会被其他的线程获取到.假设此刻另一个线程(记作线程T)获取了写锁并修改了数据,那么当前线程是无法感知线程T的数据更新的。如果当前线程获取读锁,即遵循锁降级的步骤,则线程T将会被阻塞,直到当前线程使用数据并释放读锁之后,线程T才能获取写锁进...
2020-04-24 00:58:12
623
原创 浅谈ReentrantLock
ReentrantLock构造方法: //默认使用的是非公平的锁 public ReentrantLock() { sync = new NonfairSync(); } public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairS...
2020-04-19 03:00:30
256
原创 浅谈锁的升级过程
锁锁升级的过程:无锁>>偏向锁>>轻量级锁>>重量级锁偏向锁:减少同一线程获取锁的代价;因为在大多数情况下,一把锁很多时候都是由同一个线程重复获取。在没有多线程竞争的情况下,如果同一线程每次都会去请求锁,势必会造成没必要的资源浪费。因此,为了减少同一线程获取锁的代价,引入了偏向锁的概念。偏向锁会偏向于第一个获取到该锁的线程。当第一个线程获取到一把锁时...
2020-04-19 02:44:15
667
原创 轻松理解ConcurrentHashMap的原理
ConcurrentHashMap是一种线程安全的hashmap,相对于HashTable, 它拥有更高的并发性.现在,我们就来分析一下在JDK1.8下的ConcurrentHashMap的实现及原理:get()方法 public V get(Object key) { Node<K,V>[] tab; Node<K,V> e, p; int n...
2020-04-19 02:33:06
163
原创 如何实现某个线程在其他线程执行完毕之后再执行?
我们都知道, 在使用多线程编程的时候,每个线程运行的顺序都是随机的, 它由CPU的线程调度机制决定执行哪个线程;我们可以看看正常使用多线程编程时程序的运行顺序:import java.util.ArrayList;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.C...
2020-04-19 01:41:51
5392
原创 轻松理解HashMap的实现原理
按照常规流程:实例化HashMap对象时:HashMap<String, String> hashMap = new HashMap<>();从代码中可以看出只是将负载因子设置为默认的0.75,并未作其他的操作。此时的hashmap还是一个空的map。那么,hashmap是在什么时候设置容量的呢?1.当调用无参数的构造函数创建hashmap对象时,是在第一次调用...
2020-04-17 01:44:46
87
原创 并发编程基础
创建线程的方法集成Thread类,重写run()方法,调用start方法public class T extends Thread{ private static volatile int count; @Override public synchronized void run() { for (int i = 0; i < 50 ; ...
2020-04-15 23:12:55
123
原创 MYSQL索引失效的几种情况
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。但是,有时候常常会明明建了索引,查询结果却没有使用到索引的情况。那么就说明索引失效。以下就列举出几种索引失效的情况:在举例之前,先简单的介绍一下MySQL中的explain,explain这个命令可以查看SQL语句的执行计划,结果如图所示:id: SELECT 查询的标识符. 每个 SELECT ...
2020-02-24 01:15:51
3966
原创 找出一个int类型数组中的最大数、最小数、重复次数最多的任意一个数
import java.util.HashMap;import java.util.Map.Entry;//找出一个int类型数组中的最大数、最小数、重复次数最多的任意一个数public class MaoPao { int tmp = 0; void maxArr(int[]a){ for (int i = 0; i < a.length; i++) { if (tm...
2019-07-11 13:57:10
565
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人