- 博客(17)
- 资源 (1)
- 收藏
- 关注
原创 为什么ArrayBlockingQueue不使用LinkedBlockingQueue类似的双锁实现?
为什么ArrayBlockingQueue不使用LinkedBlockingQueue类似的双锁实现?在讨论这个问题之前,我们先来回顾下BlockingQueue的这两个实现类。我比较认同“程序等于数据结构加算法”的这一说法,对于面向对象设计的Java语言而言,类的字段对应数据结构,方法对应算法,所以从关键属性和方法就可以看出一个Java类的设计思路。先放上类图,只列出关键属性和方法。1....
2019-06-30 21:36:11 5067 8
原创 TreeMap红黑树源码分析
TreeMap底层以黑红树数据结构存储数据,实现了Map.Entry接口,key/value记录实际数据,left/right/parent记录左右子节点和父节点,color标识节点颜色,只有红黑两种颜色,所以使用boolean类型。 static final class Entry<K,V> implements Map.Entry<K,V> { ...
2020-04-15 10:57:20 182
原创 mysql幻读及锁的实验
1.1什么是幻读,参考mysql官方文档:https://dev.mysql.com/doc/refman/8.0/en/innodb-next-key-locking.html上面的定义说的是在一个事务中,两次查询返回的结果不一致,重点是第二次查询是返回了更多的记录(其他事务插入的记录),这种现象被称为幻读。然后举的例子实际是一种加锁的case(select * from ... f...
2020-04-03 10:16:15 230
原创 Java线程池核心参数及实践
Java线程池的核心参数,估计很多人都能信手沾来,但如果再细问几个小问题,大部分人估计就答不上来了。1. 阻塞队列满了之后,如果线程数上限>核心线程数,新任务提交会导致创建新线程,新线程是优先执行刚到达的新任务还是阻塞队里的第一个任务?2.超过核心线程数创建的线程,再完成分配的任务之后是立即销毁还是优先检测并执行阻塞队列的未执行任务?3.为什么超过核心线程数之后,优先安排进入阻塞...
2020-03-30 20:34:47 274
原创 mybatis源码阅读笔记
1.Configuration是配置解析的核心对象,类图如下:RawSqlSource/DynamicSqlSource最终都会使用到StaticSqlSource封装sql语句,前者在解析xml时就已经实例化StaticSqlSource,后者在执行sql时实例化,即动态SQL。2.sq语句解析#{}与${}的区别1.${}传参为动态sql,对应DynamicSql...
2019-11-02 23:39:15 144
原创 BigDecimal为什么能做到高精度计算
很多人都知道在Java高精度计算时需要使用BigDecimal,实际上,很多对数值精度敏感的领域,比如结算、财务,也确实都是使用BigDecimal这种高精度计算工具来实现的,在二进制计算机的世界了,在有限的存储介质上无法准确保存0.1,就像十进制无法准确保存1/3类似,如果研究的更理论一些,可以看一下IEEE754二进制浮点数算术标准(https://baike.sogou.com/v51404...
2019-08-31 22:12:18 4500
原创 AbstractQueuedSynchronizer怎么用的?
AbstractQueuedSynchronizer是一个很复杂的抽象类,主要用于实现线程同步的各类解决方案,一共两千多行代码,本文不分析源码细节,试图从宏观层面分析AbstractQueuedSynchronizer的设计思路以及一些实际的使用场景。1、在线程的6种状态中,有三种使线程暂停的状态:BLOCKED/WAITING/TIME_WAITING,AQS将处于这三种状态的线程封装到No...
2019-07-07 23:27:17 284
原创 Thread的6种状态
Thread类中有一个State的枚举类型,定义了6种状态,源码如下:各个状态之间是可以相互转换的,状态图如下:为了加深Thread状态的理解,下面写了个测试程序,代码和结果如下:public class ThreadTest { public static void main(String[] args) { final Object obj...
2019-06-22 00:04:09 2110 1
原创 记一次Thread.join的思考(如何打断join阻塞状态?)
最近在温习Java Thread的各种状态变化,想到Thread.join方法的用法:当前线程阻塞到被join线程结束后才继续执行。于是我翻了以下Thread.join方法的源码,如下图:在发现join方法内部其实使用wait方法来实现的,我立即想到了对应的notify/notifyAll方法,当时就想着既然是用wait进行线程休眠,我是不是可以用notify/notifyAll来进行唤醒...
2019-06-20 23:56:42 2119
原创 Lock/Condition/Future示例,基于异步通信的同步机制
Java通过Lock类提供了高级的锁特性,它在获取锁的时候可以做更灵活的控制,比如设置获取锁的最长等待时间。Lock可以与多个Condition对象配合,Lock替代synchronized进行共享对象的锁控制,而Condition替代了Object监控方法的使用,Object中的wait/notify/notifyAll方法,可对应Condition中的await/signal/sinallAl...
2018-09-09 21:38:53 444
原创 coding - 快速排序
最近复习了《数据结构》,对于排序算法比较感兴趣,下面使用Java实现了一种快速排序算法。另外,在coding时发现Arrays类的sort方法使用了一种dual-pivot快速排序算法,比较好奇,于是找了些文章了解,算法世界果然奇妙,对于想了解该算法思想的同学,推荐仔细看一下这篇博文:https://blog.csdn.net/Holmofy/article/details/71168530...
2018-09-03 21:39:16 175
原创 Semaphore示例
java.util.concurrent.Semaphore提供了控制并发的工具类,关键方法是acquire()和release(),它提供一种基于许可的同步机制,初始化一定的许可数量,同步参与者先获取许可,再执行操作,然后释放许可。假如将许可数设置为1,就是一种简单的互斥锁的实现,即同一时间只有一个线程获取到许可。见下面的代码示例:public class TestSemaphore {...
2018-08-29 22:36:31 259
原创 Exchanger示例
java.util.concurrent.Exchanger提供了一个在阻塞点用于线程成对交换数据的同步机制。举个简单的例子,两个人一起干浇水的活,用两个水盆,A用盆1盛水,B用盆2浇水。1、A盛满水,等待B将盆2的水用完后和B交换水盆,然后A继续盛水,B继续浇水。2、B将盆2的水用光,则等待A盛满水后交换水盆,然后A继续盛水,B继续浇水。3、在发生交换前两者各自干自己的活,互不干扰,...
2018-08-29 21:37:20 264
原创 CountDownLatch示例
java.util.concurrent.CountDownLatch提供了一种同步辅助,可用于控制N个线程一起出发,或者阻塞到N个线程到达。关键方法是await()和countDown(),内部有一个计数器,countDown()将计数器减1,await()方法阻塞到计数器为0为止(其他线程调用countDown()可能将其唤醒),如果await()被调用时计数器已经为0,则该方法直接返回,不会...
2018-08-27 21:40:12 206
原创 CyclicBarrier示例
java.util.concurrent.CyclicBarrier提供了一种多阶段协同器的工具,每个阶段都等待固定数目的线程(parties)到达阻塞点(cyclicBarrier.await()),然后执行cyclicBarrier.barrierCommand.run(),并唤醒所有参与者的阻塞状态,进入下一个阶段。为了更好的理解该工具类的使用场景,下面的代码改造自JDK API的示例,目的...
2018-08-27 21:18:36 170
原创 简单学:Java.lang.ThreadLocal
最近与人交流Spring是否线程安全的问题,了解到Spring使用了ThreadLocal,出于好奇,简单地学习了一下ThreadLocal类,大道至简,我就说说我认为比较关键的一些地方:1、ThreadLocal封装了一些与当前线程(调用方法时的运行线程)相关的方法,如以下方法分别用于获取对象、设置初始值、设置对象,每个方法都使用了Thread.currentThread()来获取当前运行线...
2018-08-21 22:31:28 324
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人