- 博客(36)
- 收藏
- 关注
原创 LinkedBlockingDeque源码解析
基于jdk1.8双端阻塞队列 线程安全的实现原理:双向链表 + 1个ReentrantLock + 2个Condition生产者和消费者同一把独占锁,同一时刻只有一个线程能获取到锁生产者在生产数据或者一个消费者在消费数据生产的数据不能为null生产者生产数据、消费者消费数据可以从队头或者队尾LinkedBlockingDeque的UML双向链表实现节点数据结构 /*...
2019-09-17 22:18:59
184
原创 LinkedBlockingQueue源码解析
基于jdk1.8线程安全底层实现原理:单项链表 + 2个ReentrantLock + 2个Condition生产和消费数据用的不是同一独占锁,生产和消费是可以同时进行生产者从队尾添加数据,消费者从队头的下一个节点开始获取数据生产数据达到了容量则生产线程等待,消费者消费完了数据则消费者线程等待头节点的数据项为null,不允许添加的数据项为nullLinkedBlockingQue...
2019-09-07 16:07:28
221
原创 ArrayBlockingQueue源码解析
基于jdk1.8数组阻塞队列 线程安全的底层:对象数组+ReentrantLock + notFullCondition + notFullConditionnotFullCondition+notFullCondition用的是同一个ReentrantLock出队列与入队列是阻塞进行的,某个时间点,只有一个线程能获取到锁,然后生产或者消费数据添加的数据不能为null 队列长度是有限制...
2019-09-04 21:30:43
184
原创 AbstractQueuedSynchronizer(AQS)源码解析二
这章来说一说ConditionObject中的notify、notifyAll没法唤醒一组特定的阻塞线程,只能唤醒全部中的一个或者全部(获取到锁的线程只有一个)Condition它可以实现唤醒特定的一组线程中的一个线程,对于同一一个锁,它可以创建多个Condition,协调控制多组线程Condition的具体实现ConditionObjectAQS中的内部类ConditionObje...
2019-08-31 10:59:57
187
原创 java基础-finalize()
确定不再有引用指向的对象,在垃圾收集时由JVM垃圾收集器调用对象的finalize方法。在JVM进行垃圾回收(通常是低级别的线程)时,处理需要被回收的对象,gc线程调用一次finalize方法,如果这时对象被重新引用上了,就不会被清理了。目前还没重写过…我们来看个具体的例子,这样会印象深刻些 public static FinalizeDemo FD = new FinalizeDem...
2019-08-27 22:09:42
193
原创 LinkedHashSet源码解析
版本:jdk1.8继承HashSet初始化的时候会把父类HashSet中的属性map初始化为了LinkedHashMap 可以保证插入或者读取的顺序LinkedHashSet默认accessOrder是以插入的顺序数据不可重复非线程安全LinkedHashSet相关的UML重要构造 /** * 把父类HashSet中的属性map初始化为了LinkedHashM...
2019-08-22 19:32:49
187
原创 Stack源码解析
版本:jdk1.8栈 先进后出FILO继承Vector 底层是由数组实现 用synchronized关键字保证线程安全已不推荐使用Stack相关的UML重要属性都是来自Vectorprotected修饰,子类是可以直接使用的 /** * 对象数组 */ protected Object[] elementData; /** ...
2019-08-21 20:36:38
162
原创 Vector源码解析
版本:jdk1.8底层由数组实现的线程安全的关键方法上都加上了synchronized同步关键字 并发安全但为此开销也会较大已不推荐使用Vector相关的UML我们先来看看HashMap重要属性 /** * 对象数组 */ protected Object[] elementData; /** * 数据的数量 */...
2019-08-20 21:40:30
134
原创 CountDownLatch源码解析
CountDownLatch 使用AQS中的共享锁一个或多个线程等待一个或多完成之后再执行await方法 同步状态的值大于0线程阻塞
2019-08-15 20:56:46
216
原创 java中线程的几种状态
线程来自百度百科线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。状态以及转换RUNNING这个状态在Thread的源码中是没有的,我这里是为了形容一下获取到了cpu的线程每种状态的的含义1. NEW尚未启动的线程处于这种...
2019-08-13 22:08:15
265
原创 Semaphore源码解析
前言在AQS源码解析一中,我们说到了AQS对锁资源获取的过程进行了抽象,帮我们实现了线程如何被挂起、如何被唤醒等操作,分析了独占模式和共享模式底层是如何实现的,今天我们来看看Semaphore(信号量)底层是怎么控制资源获取和释放的,这样可以进一步加深我们对AQS的理解。Semaphore内部使用共享锁实现有公平和非公平的两种实现以许可证为共享资源控制使用共享资源的线程数线程抢夺到指...
2019-08-12 22:48:20
140
原创 AbstractQueuedSynchronizer(AQS)源码解析一
这章不会对Condition部分进行讲解抽象的队列同步器 AQS对锁资源获取的过程进行了抽象,具体的获取过程留给子类去实现子类不用去关心在获取不到锁资源的情况下,当前线程如何被挂起,如何被唤醒这些都是由AQS来实现,获取资源和释放资源是典型的模板方式模式应用AQS的重要属性双向链表来控制锁资源的获取头节点是获取到锁的线程,thread会被置为null节点信息节点的两种模式...
2019-08-11 22:48:56
410
原创 java基础-final关键字
final 关键字修饰属性:都需要对其进行初始化,基本类型值不能改变,引用类型引用(内存中的地址)不可变,但对象自身是可以修改的修饰方法:子类不能覆盖该方法,防止有些方法被子类覆盖重新定义修饰类:类不可被继承,出去安全考虑或者是不会改动的修饰属性(基本类型,引用类型)1.都需要对其进行初始化编译器直接报错,提醒要初始化2.基本类型初始化后,值不能改变编译器直接报错3.引用...
2019-08-08 21:09:19
152
原创 多线程的三大核心
原子性一系列操作要么成功,要么失败,不存在其中的一部分成功了,一部分失败,和数据库的原子性差不多正例 public int getState() { return state; }多线程的情况下,不管那个线程获取到state都是1反例 public void stateIncrement() { state++; }这里涉及三个操作先获取state的值再对sta...
2019-07-29 20:25:58
824
原创 LinkedHashMap实现LRU
前面也说到了LinkedHashMap源码解析,感兴趣的可以去看下今天我们用它来完成LRU(最近最少使用算法)代码实现:/** * 利用LinkedHashMap实现LRU */public class LRULinkedMap<K, V> extends LinkedHashMap<K, V>{ /** * 缓存数据的个数 */...
2019-07-24 20:02:49
149
原创 LinkedHashMap源码解析
版本:jdk1.8继承了HashMap通过双向链表将所有节点连接起来主要是实现了HashMap中留的几个空方法来完成自己的特性数据可以按插入、读取的顺序访问利用它的特性可以实现LRU(最近最少使用算法)LinkedHashMap相关的UML数组+链表/红黑树实现 红黑树这里我就没话化,画了个链表意思一下先来看看有哪些重要的属性 HashMap中的这里就不说了哈,大家可以自...
2019-07-22 23:10:41
142
原创 HashSet源码解析
版本:jdk1.8底层由HashMap实现非线程安全数据不可重复 由HashMap中的key不可重复保证所有的操作都是由内部属性HashMapHashSet相关的UML我们先来看看HashMap重要属性构造 初始化了内部属性HashMaphashSet.add 由内部属性HashMap实现 public boolean add(E e) { ret...
2019-07-21 17:07:14
240
原创 HashMap源码解析
版本:jdk1.8键值对的方式存储线程不安全底层由数组+链表/红黑树实现键值都可以为null 键不允许重复 值可以重复在没有hash碰撞的情况下增删改查的时间复杂度为O(1)链表和红黑树会相互转化...
2019-07-21 16:35:02
122
原创 读取Excle内存溢出
前言早上九点多,群里说生产上出现OOM,也定位到了出现异常的代码,读取Excle导致的,问了Excle里面有六万多条数据,生产上先加大了堆内存然后重启服务问题确定因为我们已经能大概确定问题代码了,但是我们还是想确认一下登录服务器,首先要查找到对应的java进程ps -ef|grep java发现服务启动的参数类似下面的,生产设置的堆内存最大为512M-Xms50m -Xmx50m ...
2019-07-17 20:13:34
427
原创 LinkedList源码解析
版本:jdk1.8底层由双向链表实现线程不安全适合大量随机删除、插入不合适频繁的查询删除和插入 只是指针的移动 与Arraylist(数组的移动)相比是用空间去换取时间查询LinkedList会把index与(size/2)作比较 选取是从头还是从尾开始查询O(N/2) Arraylist是随机访问时间复杂度O(1)LinkedList相关的UML重要的属性 /** ...
2019-07-16 08:57:50
109
原创 mybatis源码解析-SqlSession
上一节中我们获取到的DefaultSqlSessionFactory,看看它是如何生产出SqlSession的。 //今天的重点:得到默认的DefaultSqlSession SqlSession sqlSession = sqlSessionFactory.openSession();我们一步一步往下看 //DefaultSqlSessionFactory @Override...
2019-07-15 20:50:44
221
原创 小心使用本地缓存
前言同事在修bug,过去了解了一下,大概就是前台显示的类目,一会能查到,一会查不到,但明确的是数据是被删除了的,问题分析(这时候我还不知道用的是本地缓存),...
2019-07-11 17:32:51
362
原创 ArrayList源码解析
ArrayList 数组列表底层由数组实现线程不安全适合随机查找、更新(通过下标 时间复杂度为O(1))不适合大量的新增、删除(涉及数组的移动)ArrayList相关的UML进入源码看看有哪些属性 /** * 默认容量 10 */ private static final int DEFAULT_CAPACITY = 10; /** * 长度为0数组 *...
2019-07-09 09:08:49
112
原创 java基础-对象的初始化
1. 我们先来看看各种类型的属性初始化的默认值 public byte b; public short s; public char c ; public int i ; public float f; public long l; public double d; public boolean flag ; public InitDemo initDemo;打印出来的结果是...
2019-07-08 21:06:02
2312
原创 mybatis源码解析SqlSessionFactory
看源码的时候入口方法很重要,现在很多都是用注解来代替配置文件,我们这里还是使用配置文件的方式,但万变不离其中,变来变去,其实最底层的东西还是不怎么变的,而且配置文件的方式启动,入口很简单。 public static void main(String[] args) throws IOException { //读取配置文件 生成SqlSessionFactory InputStream...
2019-06-27 21:14:20
152
原创 分页-低级错误
前言早上收到测试发来的邮件,用户关闭订单页面报连接超时,,问了其它同事,他们并没有同样的问题(这里是重点 大家可以想想)。问题分析超时,肯定是那个地方执行的太久导致的。下面是出问题的那段代码的逻辑。 //第一步查询用户订单集合 //遍历订单集合 查询订单详情 每次遍历里面设计两次查库操作 //内存分页 这里真的是惊呆我了我们想到的第一个排查点就是,订单集...
2019-06-24 22:23:17
266
原创 java基础-重载与重写
重写方法名相同方法的参数个数不同方法的参数相同但参数类型不同与返回的参数类型无关 //1 public int getInt(String str){ return 0; } //2 public int getInt(int i){ return 1; } //3 public int getInt(int i,String str){ return 1;...
2019-06-17 20:15:26
233
2
原创 java基础-控制执行流程
今天我们来看看java是如何控制程序执行流程的今日份导图1. if else1.1 只有一个if if(布尔表达式){ } 1.2 一个if 一个else if(布尔表达式){ }else{ }1.3 一个if N个else if 可能可无else if(布尔表达式){ }else if(布尔表达式){ }else{ ...
2019-06-10 21:13:53
361
2
原创 java基础-操作符
操作符相关知识点1.优先级最开始的优先级在我们脑子里大概就是先乘除后加减我们来看看在ava操作符的优先级是怎么样的:优先级运算符结合性1()、[]从左向右2!、+、-、~、++、–从右向左3*、/、%从左向右4+、-从左向右5«、»、>>>从左向右6<、<=、>、>=从左...
2019-06-07 13:27:04
404
原创 like查询后置% 索引竟然也失效
背景昨天早上接到一个任务,查询某类商品,数据库用的是mysql,版本是5.6.37,es_product 表数据不多,两万多条。执行语句我简化了一下,类似下面的这条sql:SELECT * FROM es_product WHERE goods_code LIKE 'meiju%';goods_code是建了索引的,索引类型Normal。语句执行的很慢,我们看下它的执行计划是什么:EXP...
2019-06-04 12:50:22
4356
3
原创 java基础-基本数据类型
Java中的八种基本数据类型整型byte 8位 取值范围 -2^7~2^7-1 包装类型 Byteshort 16位 取值范围 -2^15~2^15-1 包装类型 Shortint 32位 取值范围 -2^31-1~2^31-1 包装类型 Integerlong 64位 取值范围 -2^63-1~2^63-1 包装类型 Long浮点型float 32位 取值范围 -3....
2019-06-02 22:07:18
274
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人