摘要: 死锁在系统中可能出现的频率比较高,特别是在生产环境中,对于死锁发生原因的定位比较困难,读懂死锁日志是非常有必要的。下面我们来模拟死锁的产生,然后分析死锁日志。 死锁概念 对于死锁,MySQL官方文档是这样描述的: A deadlock is a situation where different t 阅读全文
posted @ 2023-11-07 15:28 mingshan 阅读(676) 评论(1) 推荐(0) 编辑
摘要: 在InnoDB中,锁的类型有如下几种: Shared and Exclusive Locks(共享S或独占X锁) Intention Locks(意向锁) Record Locks(记录锁) Gap Locks(间隙锁) Next-Key Locks Insert Intention Locks(插 阅读全文
posted @ 2023-11-07 15:27 mingshan 阅读(32) 评论(0) 推荐(0) 编辑
摘要: 在生产者消费者模型这篇文章中我们使用了ReentrantLock结合Condition实现生产者消费者模型,但我们对于ReentrantLock和Condition的工作原理并不了解,其内部的结构和源码级别实现就更加不了解了。比如在使用await方法的时候,为什么一定要用while判断条件,用if为 阅读全文
posted @ 2023-11-07 15:09 mingshan 阅读(9) 评论(0) 推荐(0) 编辑
摘要: 记得去年学习Spring MVC的时候自己学着写了一个小小的框架,用了一个AppContext来表示应用上下文,每个请求都应该有各自独立的AppContext,里面可以存储一些数据,比如数据库连接Connection等,此时考虑数据库的事务问题,即在一个线程内,一个事务的多个操作拿到的是一个Conn 阅读全文
posted @ 2023-11-07 15:07 mingshan 阅读(8) 评论(0) 推荐(0) 编辑
摘要: 栈介绍 栈是一种仅在表头进行插入和删除操作的线性表,并且属于后进先出(last-in,first-out,LIFO)原则,下面是栈的入栈和出栈的图示: 主要操作 栈主要有入栈和出栈操作,但要实现完整的栈操作,我们需要定义一些方法 push 入栈,将元素压入栈顶 pop 出栈,获取栈顶元素并将其从栈中 阅读全文
posted @ 2023-11-07 15:06 mingshan 阅读(10) 评论(0) 推荐(0) 编辑
摘要: 在JDK9中,包含了一个叫Variable Handles的新功能,下面是该功能的描述: Define a standard means to invoke the equivalents of various java.util.concurrent.atomic and sun.misc.Uns 阅读全文
posted @ 2023-11-07 14:46 mingshan 阅读(36) 评论(0) 推荐(0) 编辑
摘要: 在Java中,我们想在程序运行时调用其方法,可以用JDK提供的反射相关API来实现,代码如下: Class clazz = Demo.class; Method method = clazz.getMethod("studyHard", new Class[]{String.class}); Dem 阅读全文
posted @ 2023-11-07 14:45 mingshan 阅读(44) 评论(0) 推荐(0) 编辑
摘要: 最近看JDK11的CompletableFuture源码实现时,发现内部使用了Treiber stack,维基百科上作以下描述: The Treiber stack algorithm is a scalable lock-free stack utilizing the fine-grained 阅读全文
posted @ 2023-11-07 14:44 mingshan 阅读(60) 评论(0) 推荐(0) 编辑
摘要: 在前面的文章中总结了二叉树的一些操作,提供了二叉树前中后的递归和非递归的实现。在非递归的实现中,基本思想是利用栈来模拟递归调用遍历的过程,本质上和递归实现没有区别,空间复杂度为\(O(n)\)。是否存在一种算法,它不使用栈也不破坏二叉树结构,但是可以完成对二叉树的遍历?即: 空间复杂度为\(O(1) 阅读全文
posted @ 2023-11-07 14:42 mingshan 阅读(18) 评论(0) 推荐(0) 编辑
摘要: 反射是Java语言中一个比较重要的特性,它允许对正在运行的Java进行观测,甚至动态修改程序,即在运行态,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。 反射API介绍 获取Class对象 通常来说,使用反射API的第一步是获取Class对象,在J 阅读全文
posted @ 2023-11-07 14:38 mingshan 阅读(25) 评论(0) 推荐(0) 编辑
摘要: 链表作为一种数据结构我们是比较熟知的,相对数组来说插入和删除操作性能比较高,因为数组涉及到移位操作,但数组可以利用二分法进行快速查找,而在链表中想要获取当前元素,就必须知道该元素的上一个节点(头节点除外),这就限制了链表在查找操作的性能,试想有没有一种数据结构,在链表基础上也能实现类似二分查找这样较 阅读全文
posted @ 2023-11-07 14:34 mingshan 阅读(29) 评论(0) 推荐(0) 编辑
摘要: ReentrantLock源码学习 - 释放锁(unlock) 上次谈到了利用ReentrantLock的非公平和公平加锁方式,那么接下来看看释放锁的流程 首先调用ReentrantLock的unlock方法 public void unlock() { sync.release(1); } 然后会 阅读全文
posted @ 2023-11-07 14:31 mingshan 阅读(9) 评论(0) 推荐(0) 编辑
摘要: ReentrantLock 学习 - 获取锁(JDK 1.8) ReentrantLock 提供非公平锁与公平锁两种加锁方式, 默认加锁方式为非公平锁。 ReentrantLock类的结构为: 从图中可以看出,ReentrantLock类包含三个静态内部类: Sync NonfairSync Fai 阅读全文
posted @ 2023-11-07 14:31 mingshan 阅读(12) 评论(0) 推荐(0) 编辑
摘要: 生产者消费者问题是一个常见而且经典的问题,相信了解过多线程或者消息队列的同学对这个名词并不陌生。正如Java常用的设计模式一样,生产者消费者问题是为了解决某一类问题而存在,参阅维基百科对Producer–consumer problem的描述: In computing, the producer– 阅读全文
posted @ 2023-11-07 14:29 mingshan 阅读(26) 评论(0) 推荐(2) 编辑
摘要: 前面我们总结了Java虚拟机的监控及诊断工具(命令行)相关命令的使用,用命令行虽然说比较方便,但不够直观,要是有图形显示JVM运行的一些情况就好了。eclipse MAT 和 Java Mission Control 是两个使用比较广泛的GUI虚拟机的监控及诊断工具,下面让我们来用用吧。 Eclip 阅读全文
posted @ 2023-11-07 08:53 mingshan 阅读(45) 评论(0) 推荐(0) 编辑
摘要: 对于普通的开发人员来说,可以阅读帮助文档或者源码来对JDK的设计以及JVM的内存管理获取一定的了解,但对于线上运行的程序,如何对程序进行监控和诊断呢?比如一个程序挂了,怎么通过分析堆栈信息、GC日志、线程快照等信息来快速定位问题?JDK的大佬早就为我们考虑到这一点,所以在JDK中包含了许多用于监控及 阅读全文
posted @ 2023-11-07 08:52 mingshan 阅读(101) 评论(0) 推荐(0) 编辑