自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 收藏
  • 关注

原创 UndoLog浅析

UndoLog基本Undo:意为撤销或取消,以撤销操作为目的,返回某个状态的操作。Undo Log: 数据库事务开始之前,会将要修改的记录放到Undo日志里,当事务回滚时或者数据库崩溃时,可以利用UndoLog撤销未提交事务对数据库产生的影响。Undo Log的产生和销毁: Undo Log在事务开始前产生; 事务在提交时,并不会立刻删除undo log,innodb会将该事务对应的undo log放到删除列表中,后面会通过一个后台线程purge thread进行回收处理。 Undo Log属于逻辑

2021-05-30 17:26:37 2212

原创 Binlog详解

Binlog详解https://www.bilibili.com/video/BV1tN411Z7iJ?p=3 视频地址使用场景① 主从复制 : 在主库中开启BInlog功能,然后主库将Binlog传给从库,从库拿到Binlog后实现数据恢复。② 数据恢复 :利用mysqlbinlog工具来恢复数据。或者binlog2sql工具③ 审计 (判断注入攻击)记录模式① Row: 日志中会记录每一行数据被修改的情况。优点: 清楚滴记录每一行数据的修改细节,可靠,可以完全实现主从数据数据同步和恢复

2021-05-30 17:24:36 1268

原创 链表插入的骚操作

今天看LinkedBlockingQueue源码,发现一个骚操作: private void enqueue(Node<E> node) { // assert putLock.isHeldByCurrentThread(); // assert last.next == null; last = last.next = node; }可以学习一下,步骤是:① last.next = node 将node结点插入到队尾② last =

2021-05-28 14:37:21 149

原创 Mysql not in的坑点

问题当not in (sql) ,如果sql查询是null指的话 最后结果会返回null举例:SELECT id,DefineSymbol FROM table1WHERE id NOT IN (SELECT DISTINCT ActionId FROM table2 )返回结果为null原因not in 的实现原理是,对每一个 t1.c1 和每一个 t2.c1(括号内的查询结果)进行不相等比较(!=)。而 SQL 中任意 !=null 的运算结果都是 false,所以如果 t2 中存在一

2021-05-26 21:13:43 509

原创 使用@RequestParam的坑点

@GetMapping(value = "/queryPaymentInfo") Result<List<PolicyPaymentInfoDTO>> queryPaymentInfo(@RequestParam("policyId") List<String> policyId, @RequestParam("tenantId") Long t...

2021-05-26 15:47:39 1298

原创 扩容时rehash的算法推导

完整源码请看HashMap的resize()方法 if ((e.hash & oldCap) == 0) { if (loTail == null) loHead = e; else loTail.next = e;

2021-05-23 16:14:58 218

原创 数据表开始时未建唯一索引的补救办法

数据表开始时未建唯一索引的补救办法业务场景在开始设计表时未添加唯一索引,在需求迭代过程中需要保证某些字段的唯一性,如果直接建立唯一索引,会报错。如果又想保留历史数据,又想在以后的数据插入时保证某些字段的唯一性,该怎么办呢?解决方案假设需要bc需要保证唯一性 <insert id="batchInsert"> insert into 表 (a, b, c ,d, e) values <foreach coll

2021-05-14 16:57:37 427 1

原创 Comparator升序还是降序的记忆

怎么记忆@Overridepublic int compare(CommentVo o1, CommentVo o2) { return o1.getTime().compareTo(o2.getTime());}这里o1表示位于前面的对象,o2表示后面的对象返回-1(或负数),表示不需要交换01和02的位置,o1排在o2前面,asc返回1(或正数),表示需要交换01和02的位置,o1排在o2后面,desc但是不用那么麻烦每次都去推理,直接这样记忆:① 把o1当作小元

2021-05-07 07:53:20 1216

原创 一致性协议

2PC 二阶段提交阶段一 提交事务请求协调者向所有的参与者节点发送事务内容,询问是否可以执行事务操作,并等待其他节点的反馈各参与者节点执行事务操作各参与者节点反馈给协调者,事务是否可以执行阶段二 事务提交根据阶段一各个参与者节点反馈的ack,如果所有参与者节点反馈ack,则执行事务提交,否则中断事务提交。事务提交1、 协调者向各个参与者发送commit请求2、 参与者节点接收到commit请求后,执行事务的提交操作。3、 各参与者节点完成事务提交后,向协调者返送提交co

2021-04-17 21:12:30 146

原创 CAP理论

一致性(Consistency)指强一致性可用性(Availability)系统提供的服务一直处于可用状态,用户的操作请求在指定的响应时间内响应请求,超出时间范围,认为系统不可用分区容错性(Partition tolerance)分布式系统在遇到任何网络分区故障的时候,仍需要能够保证对外提供一致性和可用性服务,除非是整个网络都发生故障。CP和AP在一个分布式系统中不可能同时满足一致性、可用性、分区容错性,最多满足两个,对于分布式互联网应用而言,必须保证P,所以要么满足AP模型、要么满足C

2021-04-17 20:00:22 85

原创 零拷贝

零拷贝传统 IO 问题NIO 优化进一步优化(linux2.1)更进一步优化(linux2.4)参考自《黑马程序员netty》传统 IO 问题传统的 IO 将一个文件通过 socket 写出File f = new File("helloword/data.txt");RandomAccessFile file = new RandomAccessFile(file, "r");byte[] buf = new byte[(int)f.length()];file.read(buf);S

2021-04-17 12:35:48 77

原创 简单的多路复用io实现

BossEventLooppublic class BossEventLoop implements Runnable{ private Selector boss; private volatile boolean isStart = false; private AtomicInteger index = new AtomicInteger(); private WorkerEventLoop worker; public void register(.

2021-04-17 12:30:30 84

原创 零拷贝

来自《黑马程序员netty》课程零拷贝传统 IO 问题传统的 IO 将一个文件通过 socket 写出File f = new File("helloword/data.txt");RandomAccessFile file = new RandomAccessFile(file, "r");byte[] buf = new byte[(int)f.length()];file.read(buf);Socket socket = ...;socket.getOutputStream()

2021-04-05 23:45:17 66

原创 三种io

阻塞式阻塞模式下,这些方法会导致线程阻塞ServerSocketChannel.accept 会在没有连接建立时让线程暂停 (等待客户端连接)SocketChannel.read 会在没有数据可读时让线程暂停 (等待客户端发数据)在单线程的情况下,阻塞方法之间会互相影响,基本上不能正常工作。 举个例子: A客户端建立连接,B客户端也建立连接,当遍历每个连接时,B客户端发送了数据给服务端, 但是如果先遍历到A,而A没有发送数据,则一直卡在这里,B的数据也无法处理到。而如果在多线程的情况下,

2021-04-05 18:45:57 227 2

原创 JVM异常处理小分析

可能平时朋友们都好奇,为什么没有进行try catch的处理,当我们抛出异常时还是能打印出异常堆栈信息: public static void main(String[] args) throws Exception { throw new RuntimeException("error"); }其实通过debug,可以发现线程会执行如下方法, 通过注释可以知道,当异常未被代码捕获时,jvm会调用该方法来对异常进行处理。 /** * Dispatch a

2021-04-04 22:45:00 91 1

原创 线程池源码分析

参考https://www.cnblogs.com/xiaxj/p/14275671.htmlhttps://www.cnblogs.com/superfj/p/7544971.html线程池的使用如何选择线程池数量线程池的大小决定着系统的性能,过大或者过小的线程池数量都无法发挥最优的系统性能。当然线程池的大小也不需要做的太过于精确,只需要避免过大和过小的情况。一般来说,确定线程池的大小需要考虑CPU的数量,内存大小,任务是计算密集型还是IO密集型等因素NCPU = CPU的数量UCPU =

2021-04-04 12:01:29 111

原创 Spring yml文件注入复杂类型 亲测有效

list方法一:business: list: a,b,c,d,e,f// 或者business: list: "a,b,c,d,e,f" @Value("${business.list}") List<String> list;只要用逗号分隔就好,spring注入时会自动把他们拆分方法二:business: list: "a,b,c,d,e,f" @Value("#{'${business.list}'.split(',')}")

2021-03-22 17:46:01 452

原创 刷Leetcode学sql

标题175. 组合两个表176. 第二高的薪水182. 查找重复的邮箱184. 部门工资最高的员工知识点汇总:175:LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。 右表没有记录的行会以NULL显示。176: 临时表的性质, IFNULL182: 查重可以用 group by XX having count(*)184: 元组可以多个字段 in 比如 (DepartmentId , Salary

2021-03-21 18:28:38 276

原创 【leetcode24】两两交换链表中节点

public ListNode swapPairs(ListNode head) { if (head == null || head.next == null) { return head; } ListNode dummy = new ListNode(-1); dummy.next = head.next; ListNode first = head; ListNode s...

2021-03-19 13:57:56 41

原创 通过redis实现页面锁

待定

2021-03-17 22:36:22 85

原创 垃圾回收器

理论低延迟和高吞吐量的理解高吞吐量意味着垃圾回收的频率很低,但是垃圾回收需要的时间很长,对于终端用户来说,在操作时如果发生垃圾回收STW,则会影响用户的体验。低延迟则是垃圾回收的频率很高,但是由于线程切换等的开销,使得系统的效率或者说吞吐量下降...

2021-03-17 22:24:02 58

原创 【策略模式 + 责任链模式在项目中的应用】

待定

2021-03-16 00:13:05 436 2

原创 弱引用实现的WeakHashMap

待定

2021-02-28 22:18:46 191

原创 为什么垃圾回收时需要stop the world

什么是stop the world在gc事件发生过程中,会产生应用的停顿,停顿产生时整个应用程序线程都会被暂停,没有任何响应,有点像卡死的感觉,这个停顿称为STW为什么需要stop the world可达性分析算法中,枚举根节点(GC ROOT)会导致所有java程序执行线程停顿。分析工作必须在一个能确保一致性的快照中进行一致性指整个分析期间整个执行系统像被冻结在某个时间点上如果出现分析过程中对象引用关系还在不断地变化,则分析结果的准确性无法保证。举个例子,如果分析时判断该对象已经没有引用

2021-02-28 11:08:33 1832 1

原创 LinkedHashMap

概念LinkedHashMap继承自HashMap,它的结构如图所示:hashmap是无序的,LinkedHashMap是有序的,且默认为插入顺序。LinkedHashMap通过在HashMap的基础上增加一条双向链表,实现了插入顺序和访问顺序一致。通过对HashMap一些方法的覆盖,例如newNode, replacementNode, replacementTreeNode, newTreeNode,让所有对底层HashMap数据结构修改的同时该链表进行修改,遍历的时候便是遍历这一条有序

2021-02-23 15:48:29 5687 1

原创 PriorityQueue

概念基于优先堆的一个无界队列,可以默认自然排序或通过提供的Comparator在队列实例化时排序。不允许空值,且不支持non-comparable(不可比较)的对象(即没有实现Comparable接口的类的对象)非线程安全。需要线程安全可以使用PriorityBlockingQueue(实现了BlockingQueue接口)底层的数据结构是最小堆根据二叉树的性质,可以得到如下关系:leftNo = parentNo * 2 + 1;rightNo = parentNo * 2 + 2;p

2021-02-22 15:19:43 148

原创 判断是否为子序列【通用代码】

判断target是否为s的子序列利用双指针的思想,i指向S的元素, j指向target的元素。然后遍历。 public static boolean isSub(String s, String target) { int i = 0; int j = 0; int lenS = s.length(); int lenT = target.length(); if (lenS < lenT) { return false; } while (i < len

2021-02-20 10:29:36 330

原创 java值传递还是引用传递的问题

扩展之前逛知乎看【java是值传递还是引用传递】帖子时看到这个问题Integer[] test={1,2};Integer a=test[1];test[1]= null;System.out.println(a);Integer类是引用类型,按照你所说的,最后输出应该为null,但事实上a还是2;开始时我也懵了,因为我脑子里的画面是这样的:但实际上经过思考后,其实是这样的:这就是为什么a还是2的原因。结论 : 赋null值不是在原来的内存地址上将内存清除,而是指向null。

2021-02-19 16:34:03 71

原创 【88. 合并两个有序数组】

题目解答从尾开始遍历,因为从头开始遍历需要移动元素,否则会将一些元素覆盖掉。class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int p = m - 1; int q = n - 1; int index = m + n - 1; while (p >= 0 && q >= 0) {

2021-02-17 12:01:00 65

原创 重写和重载

https://blog.51cto.com/14687333/2537239相关概念静态类型和实际类型Animal jack = new Dog()jack的静态类型为Animal, 实际类型为Dog虚方法和非虚方法非虚方法:方法在编译器就确定了具体的调用版本,则这个版本在运行时是不可变的,这样的方法称为非虚方法。如静态方法、私有方法、final方法、实例构造器、父类方法都是非虚方法。其他方法为虚方法方法调用指令invokestatic 调用静态方法,解析阶段(类加载的链

2021-02-15 00:03:04 89

原创 i++和++i

基础public static void main(String[] args) throws Exception { int i = 5; int a = ++i; int j = 6; int b = j++; }编译为字节码指令: 0: iconst_5 1: istore_1 // 将5存放到【局部变量表】下标为1的位置 2: iinc 1, 1 // 将下标为1的位置的

2021-02-14 21:00:17 89

原创 双亲委派机制的优势

优势避免类的重复加载通过向上委托的方式,如果一个类已经被父加载器加载了,就不会再重复被子类加载器所加载。保护程序安全,避免核心API被篡改 (沙箱安全机制)比如自定义一个包叫 java.lang,里面有String类,这时就相当于是去篡改了java的核心类库。而双亲委派机制就实现了核心api的保护,因为在加载自定义String类时会往上委派给bootstrap引导类加载器加载,而引导类加载器在加载的时候会jkd自带的rt.jar包中的String类。这样就可以保证java核心源代码的保护。举例

2021-02-14 17:44:26 691

原创 【26. 删除排序数组中的重复项】

题目解法双指针如果nums[i] == nums[j] 说明还是重复项,j继续++如果nums[i] != nums[j] 则将nums[j]移到nums[i+1]处class Solution { public int removeDuplicates(int[] nums) { int i = 0; for (int j = 1;j < nums.length;j++) { if (nums[i] != nums[j]

2021-02-06 08:49:54 41

原创 【leetcode 滑动窗口】

滑动窗口的思想滑动窗口可以套用模板:int left = 0;int max;for (int right = 0;right < s.length(); right++) { // 当字符串不符合要求时,才向右滑动左指针left }leetcode 3. 无重复字符的最长子串class Solution { public int lengthOfLongestSubstring(String s) { int left = 0; int

2021-02-05 21:33:01 73

原创 【leetcode 2. 两数相加】

题目题解class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { int carry = 0; ListNode res = new ListNode(-1); ListNode p = res; while (l1 != null && l2 != null) { int sum = l1.val

2021-02-05 11:18:23 48

原创 java中join()方法的等价写法分析

join()的用法:join()方法是调用者轮询来查看该线程的alive状态,调用者使用 t1.join()来等待t1线程结束。join()源码 public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) {

2021-02-03 15:55:39 200 1

原创 【剑指 Offer 21. 调整数组顺序使奇数位于偶数前面】

题目快慢指针法需要注意的就是里面while循环的 left < right 判断条件, 因为如果没有这个判断条件,可能会导致 left和right超出数组的范围class Solution { public int[] exchange(int[] nums) { int left = 0; int right = nums.length - 1; while (left < right) { while (

2021-02-03 15:31:08 33

原创 【剑指 Offer 07. 重建二叉树】

题目题解/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { int[] p; // 保存某个结点在中序遍历的下标,用于快速找到中序遍历的根节点 Map

2021-01-29 18:02:48 44

原创 【剑指 Offer 14- I. 剪绳子】

题目思路dp[i] 代表长度为i的绳子获得的最大乘积那么对于长度为i的绳子,就有两种剪法① 剪去长度j,剩下的绳子不再剪,乘积为 j * (i - j)② 剪去长度j,剩下的绳子继续剪,剪出剩下绳子能获得的最大乘积,即dp[i - j]然后比较这两种剪法,取最大乘积者即可。class Solution { public int cuttingRope(int n) { int[] dp = new int[n + 1]; dp[1] = 1;

2021-01-29 13:31:50 50

原创 自动装箱和拆箱

什么是自动装箱和拆箱概念:装箱就是自动将基本类型数据转为包装类型;拆箱就是自动将包装类型转为基本类型。具体实现:// 自动装箱:Integer total1 = 99; // 编译后 Integer total = Integer.valueOf(99)// 自动拆箱int total2 = total1; // 编译后 int total2 = total1.intValue()源码分析:valueOf判断i的大小是否在 [-128,127]① 在,则从缓存池中获取Inte

2021-01-28 18:03:34 178

空空如也

空空如也

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

TA关注的人

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