自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 资源 (2)
  • 收藏
  • 关注

原创 方法耗时自定义注解

在想要观察耗时的方法上添加注解@CostLogger即可@CostLoggerpublic ApiResult send(NoticeDTO noticeDTO) {此处省略代码…}效果:相应代码和jar包

2020-09-10 19:29:43 15 1

原创 日常记录——MySQL—参数设置

back_log:MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中,请求等待区。等待连接的数量超过back_log,将不被授予连接资源。wait_timeout:MySQL客户端的数据库连接闲置最大时间值,单位秒。max_connections:最大连接数。max_user_connections:同一个账号能够同时连接到mysql服务的最大连接数,0表示不限制。thread_concurrency:并发线程数,该参数到5.6版本就去掉。default-storage-engi

2020-08-16 17:36:46 20

原创 日常记录——leetcode- 整数反转

题目:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。题解:public static int reverse(int x) { Long result = new Lon

2020-08-07 00:11:04 21

原创 日常记录——leetcode- 字符串相加

题目:给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。提示:num1 和num2 的长度都小于 5100num1 和num2 都只包含数字 0-9num1 和num2 都不包含任何前导零你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式题解:public String addStrings(String num1, String num2) { StringBuilder result = new StringBuild

2020-08-06 01:12:25 21

原创 日常记录——MySQL—优化

1.使用索引可以增加查询效率,但维护索引也需要成本。2.组合索引,注意最左匹配原则。

2020-08-04 23:11:29 47

原创 日常记录——leetcode- 爬楼梯

题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1 阶 + 1 阶2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。3. 1 阶 + 1 阶 + 1 阶4. 1 阶 + 2 阶5. 2 阶 + 1 阶题解://递归public int climbStairs(int n){

2020-08-03 23:23:36 67

原创 日常记录——MySQL—数据类型

一、设置建议越小越好:在数据预估范围内,一般情况下选择可以正确存储数据的最小数据类型。越小的数据类型通常更快,占用磁盘,内存和CPU缓存更小。越简单越好:简单的数据类型的操作通常需要更少的CPU周期。例如:整型比字符操作代价要小得多,因为字符集和校对规则(排序规则)使字符比整型比较更加复杂。尽量避免NULL:NULL需要额外的空间并且索引统计和比较的时候更复杂。二、数据类型1.整数类型类型长度有符号范围无符号范围场景tinyint1(-128,127)(0,255

2020-08-03 01:03:34 22

原创 日常记录——MySQL—锁

一、简介锁是计算机协调多个进程或纯线程并发访问某一资源的机制。永爱保证数据并发访问的一致性、有效性。模式:共享锁(读锁):其他事务可以读,但不能写。排他锁(写锁) :其他事务不能读取,也不能写。大体可分为两类:表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率高,并发度低。行级锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。*默认情况下,表锁和行锁都是自动获得的, 不需要额外的命令,select前,会自动加读锁。insert 、update、dele

2020-08-02 00:25:55 21

原创 日常记录——MySQL—执行计划

执行计划:sql语句的执行过程。查看示例:EXPLAIN select * from user;字段1.id:sql执行顺序,id相同由上到下,id不同,大的先执行。2.select_type:类型含义sqlSIMPLE简单的 select 查询,查询中不包含子查询或者 unionEXPLAIN select * from user;PRIMARY查询中包含子查询或者 union ,外层为PRIMARY类型EXPLAIN select * from use

2020-08-01 01:20:31 57

原创 日常记录——MySQL—日志文件、事务

一、日志文件1.undo log:回滚日志,保证事物原子性,记录事务发生之前的一个版本,用于回滚,innodb事务可重复读和读取已提交的隔离级别就是通过mvcc+undo实现 。2.redo log:保证持久化日志,发生故障,保障已经提交的事物不丢失,而未提交的事物能回滚,达到事务一致性。redo log 写入时分为两个步骤,在事务 A 提交的时候执行到prepare阶段, binlog写入后 ,再执行到把 commit阶段,在合适时间将redolog的数据写入到磁盘中。redolog是多文件,重复写,

2020-07-31 01:44:21 46

原创 日常记录——MySQL—InnoDB和MyISAM区别

1.数据结构:InnoDB是将索引和数据存放在一起的,MyISAM是将索引文件和数据文件分开存放。使用工具创建两个表,一个存储引擎为InnoDB的innodb表,一个存储引擎为MyISAM的myisam表观察data文件,可发现InnoDB存储引擎有两个文件.frm(表定义)和.ibd(数据+索引),MyISAM有三个文件.frm(表定义)和.MYD(数据)和.MYI(索引)。2.索引:同样索引结构都选择B+Tree,但InnoDB使用聚簇索引(叶子节点存数据或主键值),MyISAM是非聚簇索引(

2020-07-30 00:25:23 27

原创 日常记录——MySQL—sql执行过程、索引结构、索引类型

一、sql执行过程二、索引结构索引存储在磁盘,磁盘每次读取页的整数倍(4k一页),数据量大会造成多次IO,所以尽量在创建索引的时候,在同样大小情况下,存储更多的索引。MySQL的索引结构为B+Tree:每个非叶子节点存储子节点磁盘指针和主键,存储更多的索引,降低IO次数,叶子节点存储磁盘指针和实际数据或者主键的值(InnoDB)或者数据的指针(MyISAM),并且叶子节点之间是链式环结构。即可满足随机查找和范围查找。为什么不使用其他结构:1.hash表:散列结构,范围查找效率低。2.二叉树

2020-07-29 00:31:38 682

原创 日常记录——JVM—GC常用参数

一、GC常用参数1.-Xmn -Xms -Xmx -Xss : 年轻代 最小堆 最大堆 栈空间2.-XX:+UseTLAB : 使用TLAB(线程本地分配缓存区),默认打开3.-XX:TLABSize:设置TLAB大小4.-XX:+DisableExplictGC:System.gc()失效5.-XX:+PrintGC:打印GC信息6.-XX:+PrintGCDetails:打印GC详细信息7.-XX:+PrintGCTimeStamps:打印GC系统时间8.-XX:+PrintVMOpti

2020-07-28 01:20:52 44

原创 日常记录——JVM—PS+PO的GC日志分析

一、代码public class GCtest { public static void main(String[] args) { List<byte[]> byteList = new ArrayList<>(); for (;;){ byte[] bytes = new byte[1024]; byteList.add(bytes); } }}二、配置-Xm

2020-07-27 00:56:16 122

原创 日常记录——leetcode- 无重复字符的最长子串

题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。解答代码

2020-07-26 01:36:15 38

原创 日常记录——JVM—G1垃圾回收器

一、简介、G1垃圾回收器(Garbage First):是当今垃圾回收技术最前沿的成果之一,在17年作为JDK9默认的垃圾处理器。是一个可控的STW时间垃圾回收器,通过-XX:MaxGCPauseMillis 设置预期STW最大时间,G1会尽量达成目的,但不一定达成。二、原理G1垃圾回收器逻辑上存在年轻代、年老代之分,但实际在内存分配上将内存分成一小块一小块的Region,每个Region在某一时刻代表年老区(O),伊甸区(E),幸存区(S),大对象区(H,属于年老代,一个对象超过一半区域就放入H区)

2020-07-25 00:48:41 50

原创 日常记录——JVM—垃圾回收器(除G1、ZGC)

一、Serial 收集器Serial:工作在年轻代的垃圾回收器,采用复制算法,单线程工作。GC线程工作时,用户线程停止工作,造成停顿STW(Stop The World),开启参数-XX:+UseSerialGC。二、Serial Old 收集器Serial Old :工作在年老代,采用标记整理算法,单线程工作。GC线程工作时,用户线程停止工作,造成停顿STW。三、ParNew收集器ParNew:Serial收集器的多线程版本,工作在年轻代,采用复制算法,多线程工作,在多核cpu提高GC效率,

2020-07-24 01:21:24 96

原创 日常记录——JVM—垃圾定义、垃圾寻找、基本垃圾回收方法、堆内存逻辑分区

一、垃圾定义一个没有引用指向的对象,就是垃圾。可以理解为断了线的风筝。二、垃圾寻找1.引用计数法:有一个引用指向该对象,该对象头部的计数器加一,失效就减一,为0则代表垃圾。java不使用该方法,该方法存在循环引用问题,A指向B ,B 指向A 。则 A B 的计数器最小为1,不会回收。2.可达性分析法:通过一系列名为GC Roots的对象作为起始点,不在GC Roots的引用连路上的对象则为垃圾。GC Roots对象:线程栈变量(方法的局部变量),静态变量(class的静态变量),常量(calss的常

2020-07-23 00:57:21 57

原创 日常记录——JVM—new Object()

一、对象创建过程1.loading:加载对应类class文件。2.linking:验证文件格式(verification)、为类的静态变量分配内存,并初始化为默认值(preparation)、将符号引用转成直接引用(resolution)。3.initializing:初始化过程为类的静态变量赋予正确的初始值.4.为对象分配内存。5.成员变量赋默认值。6.调用构造方法:成员变量赋默初始值,其他语句。二、对象结构1.对象头:Mark Word(标记字段)、Class Pointer(类型指针)

2020-07-22 00:39:33 743

原创 日常记录——JVM—自定义类加载器

一、简介自定义类加载器实现方式为,继承ClassLoader类,重写其内部方法。简单介绍一下ClassLoader的与加载类相关的方法:1.getParent():返回该类加载器的父类加载器。2.loadClass(String name):加载名称为 name 的类,返回的结果是 java.lang.Class 类的实例。3.findClass(String name):查找名称为 name 的类,返回的结果是 java.lang.Class 类的实例。4.findLoadedClass(Str

2020-07-21 00:26:47 58

原创 日常记录——JVM—类加载器工作原理

一、简介类加载器:负责读取 Java 字节代码文件(.class),并转换成 java.lang.Class 类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance() 方法就可以创建出该类的一个对象。即将对应类的.class文件中的二进制流加载到内存空间。二、类加载器分类类加载器一共有四种:1.Bootstrap ClassLoader :引导类加载器,它用来加载 Java 的核心库(存放在<JAVA_HOME>\lib目录中),是用原生代码来实现

2020-07-20 01:20:28 61

原创 日常记录——JVM—JVM简介、class文件解析

一、JVM简介JVM:Java Virtual MAchine-Java虚拟机,可以将class文件解释为各种平台可执行的指令行,java中一个类在运行时,首先将java文件编译(javac)为class文件,然后jvm将class文件解释并执行。JVM可分为三部分:类加载器(ClassLoader)系统、执行引擎、运行时数据区。类加载器系统:负责加载程序中的类和接口。执行引擎:解释执行+即时编译(JIT),开始对所有的代码都采取解释执行的方式,经常调用的方法编译为本地代码。运行时数据区:程序计数

2020-07-19 01:40:51 304 1

原创 日常记录-git安装

1、下载安装包git官网地址:https://git-scm.com/点击这个下载安装包:已经下载到桌面,双击它进行无脑式安装:点击next:选择安装路径,再next:继续无脑next:第一个是生成左面快捷方式,第二个window右键,第三个大文件支持,第四个默认打开方式,第五个.shw文件在Bash 运行 ,第六个在所有控制台使用TrueType字体,第七个每天检查git更新程序默认名字 不用改 继续:默认文本编辑器 不用改 继续:选择适应环境变量 选第一个:远程连接

2020-07-18 02:47:56 52

原创 日常记录——leetcode- 两数相加

题目:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807解答代码:public ListNode addTwoNum

2020-07-18 02:12:04 38

原创 日常记录——多线程与高并发—ForkJoinPool简介、代码示例

一、ForkJoinPool简介ForkJoinPool:以拆分合并为核心的线程池,执行ForkJoinTask类型任务,两个类继承RecursiveAction(无返回值递归),RecursiveTask(有返回值递归)。ForkJoinPool中每个工作线程自己维护一个任务队列,当自己任务队列任务执行完,会从其他工作线程的任务队列取任务执行。ForkJoinPool是ExecutorService的扩展,更适合的是计算量大的任务。二、代码示例分别用迭代和ForkJoinPool 累加1-10000

2020-07-17 00:23:54 41

原创 日常记录——多线程与高并发—ThreadPoolExecutor源码解析

package java.util.concurrent;import java.security.AccessControlContext;import java.security.AccessController;import java.security.PrivilegedAction;import java.util.concurrent.locks.AbstractQueuedSynchronizer;import java.util.concurrent.locks.Conditio

2020-07-16 03:46:50 65

原创 日常记录——多线程与高并发—Executors提供的常用线程池、基于ThreadPoolExecutor自定义线程池
原力计划

一、简介Executors工具类提供了四种线程池的创建分别为:newSingleThreadExecutor(单线程池)、newFixedThreadPool(固定线程池)、newCachedThreadPool(缓存线程池)、newScheduledThreadPool(周期线程池),四种线程池各有特点,分别介绍下:1.newSingleThreadExecutor:创建一个单线程的线程池,这个线程池只有一个线程在工作,线程池保证所有任务的执行顺序按照任务的提交顺序执行。public static

2020-07-15 01:24:14 39

原创 日常记录——多线程与高并发—ThreadPoolExecutor线程池核心参数、执行逻辑
原力计划

一、简介线程池:一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。类关系图:二、ThreadPoolExecutor线程池核心参数真正创建的线程池是ThreadPoolExecutor类,ThreadPoolExecutor的构造方法: public ThreadPoolExecutor(int corePoolS

2020-07-14 00:20:29 84

原创 日常记录——多线程与高并发—交替打印数字与字母,交替输出1A2B3C4D...26Z
原力计划

一、介绍用两个线程,一个输出字母,一个输出数字,交替输出1A2B3C4D…26Z。实现逻辑:使用控制方法,控制两个线程交替按顺序打印。二、实现代码1.synchronized+wait+notify:依赖对象的锁的原理,wait将线程放入等待池,notify唤醒锁资源竞争的线程放入锁池,在对象锁池的才有资格竞争锁资源。 static int num = 1;//从1开始 static char word = 'A';//从A开始 public static void mai

2020-07-13 00:55:19 264

原创 日常记录——多线程与高并发—并发容器queue的实现类ConcurrentLinkedQueue、继承接口BlockingQueue
原力计划

1.ConcurrentLinkedQueue:是一个适用于高并发场景下链接节点的无界线程安全队列,基于cas支持高并发,非阻塞队列。add方法: public boolean add(E e) { return offer(e); } public boolean offer(E e) { //为空抛出异常 checkNotNull(e); //创建新节点 final Node<E> newNode = new Nod

2020-07-12 02:33:55 65

原创 日常记录——多线程与高并发—并发容器Map实现类Hashtable、ConcurrentHashMap、ConcurrentSkipListMap
原力计划

一、简介1.Hashtable:Entry<K,V>的数组加链表结构,默认长度11,扩容因子0.75,每次扩容后长度为(之前的长度*2)+1。基于synchronized方法保证线程安全。put方法:计算索引值,判断应该放在哪个索引下,如果这个索引下有相同key,则覆盖,返回旧值,否则返回null。public synchronized V put(K key, V value) { // Make sure the value is not null if

2020-07-11 01:21:52 75

原创 日常记录——多线程与高并发—并发容器Set实现类CopyOnWriteArraySet和ConcurrentSkipListSet
原力计划

一、简介1.CopyOnWriteArraySet:一个基于ReentrantLock锁的线程安全的set接口实现类。内部实际使用CopyOnWriteArrayList,底层同样是数组结构。add方法:在add前先判断是否已经存在,存在返回fasle,否则复制扩展长度,然后添加到数据内。 public boolean addIfAbsent(E e) { Object[] snapshot = getArray(); return indexOf(e, snapsho

2020-07-10 01:44:04 93

原创 日常记录——多线程与高并发—并发容器List实现类vector和CopyOnWriteArrayList

一、简介1.vector:JDK1.0版本添加的类。继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口。底层是数组结构,默认长度为10,每次扩容翻倍。Vector中的操作是线程安全的。因为大部分方法都使用synchronized修饰。例如add方法: public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(elementCount

2020-07-08 23:57:30 86 2

原创 日常记录——JVM—java的四种引用及代码演示效果

一、简介java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象,对象的引用包括:1.强引用:使用 new 这个关键字创建对象时创建出来的对象就是强引用。GC宁愿抛出OutOfMemoryError也不会回收有强引用的对象。2.软引用SoftReference:软引用的对象如果内存空间足够,GC不会回收,如果内存空间不足,就会回收该对象。可以和引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被回收,就会把这个软引用加入到与之关联

2020-07-08 01:04:14 69

原创 日常记录——多线程与高并发—ThreadLocal概念、原理、使用、ThreadLocal和synchronized对比

一、概念ThreadLocal:线程本地变量,以空间换时间的方式为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。可以理解为一个当前线程的map对象,key为当前ThreadLocal,value为存放的对象。二、原理1.set():ThreadLocal为当前线程存储对象方法,设置当前线程对应的线程局部变量ThreadLocal.ThreadLocalMap threadLocals的值。如果不存在则用创建一个,然后将hreadLoc

2020-07-07 00:07:18 60

原创 日常记录——多线程与高并发—基于ReentrantLock非公平锁的获取锁、释放锁阅读AQS源码

一、简介AQS全名AbstractQueuedSynchronizer,是构建锁和同步容器的框架。内部维护了两个队列,一个是等待队列(CHL),还有一个是条件队列(condition用的,调用await(),线程会进入条件队列,等待被唤醒,唤醒后以自旋方式获取资源或处理中断异常;调用signal(),线程会插入到等待队列,唤醒被阻塞的线程)。实现的主要逻辑依靠state锁状态和内部类Node:state:锁资源状态,为0当前锁资源未被占用,>0被占用。内部类Node:双向链表结构,内含变量、方法

2020-07-06 02:25:42 64

原创 日常记录——leetcode- 交替打印FooBar

题目:我们提供一个类:class FooBar {public void foo() {for (int i = 0; i < n; i++) {print(“foo”);}}public void bar() {for (int i = 0; i < n; i++) {print(“bar”);}}}两个不同的线程将会共用一个 FooBar 实例。其中一个线程将会调用 foo() 方法,另一个线程将会调用 bar() 方法。请设计修改程序,以确保 “foobar”

2020-07-05 00:11:36 49

原创 日常记录——多线程与高并发—ReadWriteLock概念、原理、使用、ReadWriteLock和synchronized对比

一、概念ReadWriteLock:见词知意,读写锁。正常业务中读操作往往比写操作更多,然后用独占锁去加锁,就会造成同样的读操作,只能排队等待,业务执行效率会降低,JDK1.5之后添加了读写锁ReadWriteLock,是一个接口,提供了readLock和writeLock两种锁的操作机制,一个读锁(共享锁),一个是写锁(排它锁)。特性为:读读共享,读写互斥,写写互斥。二、原理ReadWriteLock底层也是基于AQS实现的,独占锁往往用int类型的全局变量state(0或者>0)来判断当前锁

2020-07-04 01:20:45 89 1

原创 日常记录——多线程与高并发—控制器CountDownLatch、CyclicBarrier、Phaser、Semaphore、Exchanger、LockSupport

一.概念1.CountDownLatch:计数器控制器,对初始化数量的递减直到0,允许继续运行。2.CyclicBarrier:批量控制器,当数量到达设定值,统一执行。3.Phaser:阶段控制器,分阶段执行逻辑,1阶段满足,2阶段才会开始。4.Semaphore:信号控制器,信号数量控制,获取到信号的才可以执行。5.Exchanger:只适用2个线程交换数据,基本用不到。二.使用1.CountDownLatch:public static void main(String[] args)

2020-07-02 23:27:45 65

原创 日常记录——多线程与高并发—ReentrantLock概念、原理、使用、ReentrantLock和synchronized比较

一、概念ReentrantLock是接口lock的实现类,实现为基于CAS+AQS(AbstractQueuedSynchronizer构建锁和同步容器的框架)的可重入锁,默认为非公平锁,可通过构造器定义为公平锁。二、原理ReentrantLock获取锁的原理:先通过CAS判断锁资源是否被占用。如果此时已经有线程占据了锁,那就加入AQS队列并且被挂起。当锁被释放之后,排在队列队首的线程会被唤醒,然后CAS再次尝试获取锁。在这个时候,如果:非公平锁:当排在队列队首获取锁资源,如果同时还有另一个线程进来

2020-07-02 00:04:46 58

common.zip|common.zip

基于springboot的方法耗时自定义注解和切面,使用时将注解@costlogger注解到相应方法上,使用日志输出方法耗时。

2020-09-10

ideaworker.zip

博主的多线程文章的测试类-线程创建以及线程控制器 内含创建线程、synchronized、ReentrantLock、ReadWriteLock、CAS、四种引用、并发控制器、volatile

2020-07-08

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除