![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JDK
文章平均质量分 77
小小少年_
这个作者很懒,什么都没留下…
展开
-
ConcurrentHashMap原理
所以,总结来看,concurrentHashMap线程安全的原因有以下几点会通过cas,对tab[i]位置进行赋值在插入元素的时候,会通过synchronized来加锁在统计hashmap中元素个数的时候,通过volatile修饰的变量,以及cas操作来完成+1。原创 2023-03-16 09:28:09 · 443 阅读 · 1 评论 -
concurrentHashMap扩容细节
针对扩容和put的原理,这个问题,我在学习的时候,一直有一个疑问点:假如当前A线程已经对15这个位置扩完容了,那如果这时候B线程又对15这个位置插入了元素,要怎么处理?通过对代码的仔细查看学习,找到了这个问题的答案在扩容的时候,假如线程A对i这个位置扩容完成了,那线程A会把原数组中i位置,放入一个ForwardingNode对象,放入的这个对象很有讲究,也起到了很大的作用,这个和put时的一些逻辑处理有关系......原创 2021-04-09 08:12:34 · 2155 阅读 · 4 评论 -
futureTask
futureTask可以用来异步获取执行结果,也就是说,业务代码的线程和主线程,可以同时执行,在需要获取执行结果的时候,调用其get()方法,就会阻塞主线程,直到获取到执行结果之后,再继续执行主线程的代码,具体的用法,不再详细叙述使用public class FutureTaskTest { public static void main(String[] args) throws Exception{ FutureTask<Integer> futureTask原创 2022-02-24 08:34:38 · 260 阅读 · 1 评论 -
jdk动态代理为什么只能为接口生成代理类?
在动态代理原创 2021-12-25 15:28:03 · 2906 阅读 · 0 评论 -
自定义类加载器的父类为什么是AppClassLoader?
我们如果自定义一个类加载器,默认设置的父类加载器是AppClassLoader原创 2021-09-22 19:50:22 · 3254 阅读 · 1 评论 -
jdk优先级队列、延迟队列原理
优先级队列PriorityQueue这个类,是优先级队列的核心,包括我们下面要说的延迟队列,在jdk6之前,也是以这个为基础的在该类中,维护了几个核心的属性transient Object[] queue; // non-private to simplify nested class accessprivate int size = 0;private final Comparator<? super E> comparator;这里的queue,就是实际存放元素的数组结构原创 2021-04-17 08:51:19 · 568 阅读 · 0 评论 -
JDK-阻塞队列、非阻塞队列原理
在jdk提供的队列中,有阻塞队列和非阻塞队列原创 2021-04-14 08:51:15 · 630 阅读 · 0 评论 -
ReentrantLock源码lock和tryLock区别
在reentrantLock中,提供了一个lock和一个tryLock方法,这两个方法是有区别的,这篇笔记主要记录下具体的区别信息结论其实对于这个两个方法,简单来说,tryLock()方法,返回的是一个boolean类型变量,返回true,表示加锁成功,返回false,表示加锁失败,但是这个方法是没有排队的功能的lock()方法有两个功能:尝试加锁 + 排队;所以,lock方法如果加锁失败,会去排队,我们也可以简单的认为,lock = tryLock + 排队方法lock()源码lock在加锁的时原创 2021-04-13 08:49:03 · 547 阅读 · 0 评论 -
jdk优先级队列是如何实现的
在jdk中,自带了一个优先级队列,scheduledThreadPoolExecutor自己内部也实现了一个优先级队列我们先不考虑jdk是如何实现的,其实让我们自己去实现一个优先级队列的实现的话,完全可以这样来做:在入队的时候,根据当前key对应的hash值,或者是根据自己的特定的比较规则,从第一个元素开始对比,如果当前要入队的值小于队列中的第一个key,就插入到前面,反之,继续往后去对比,这样就可以实现一个简单的优先级队列,在每次取出来第一个元素的时候,就是优先级最高的所以:对于优先级队列来说,最为原创 2021-03-20 08:59:21 · 308 阅读 · 0 评论 -
ScheduledThreadPoolExecutor之scheduleWithFixedDelay和scheduleAtFixedRate的区别
结论其实自己在看这个源码的时候,只是看到这两个方法都是周期性执行任务的,但是没有仔细去看两个方法的细节,所以,这篇笔记主要记录两者的区别整个源码细节看下来之后,我认为这两个方法最大的一个区别是:scheduleAtFixedRate是在上一次任务的开始时间的基础之上,加上指定的时间间隔,作为当前任务执行的开始时间scheduleWithFixedDelay是在上一次任务执行完毕之后的基础之上,加上指定的时间间隔,作为当前任务执行的开始时间我们假如定时执行周期都设置为5S,任务执行需要耗时2S,以原创 2021-03-11 13:06:14 · 2121 阅读 · 0 评论 -
LongAdder原理
对于longAdder的应用,也是在看到concurrentHashMap源码中,统计数组中元素个数的时候,看到了Doug Lea写的一个注释,才开始去关注这个类,这里主要记录下自己对该类源码的学习笔记longAdder核心思想通常,在说到这个类的时候,会和atomic中原子类有关系,atomicInteger底层的话,通过unsafe中的native方法进行compareAndSwap方法去进行值的更新,同时,在atomic类中声明的value是volatile修饰,保证了可见性;这个是没问题的,但原创 2021-03-07 09:10:05 · 214 阅读 · 1 评论 -
ThreadLocal源码学习
之前在看源码的时候,忽略了这个知识点,但是在后面看到框架底层源码的时候,看到spring的事务有用到这个点,所以就再回头学习下threadLocal的原理原创 2021-03-06 14:37:55 · 117 阅读 · 0 评论 -
Future机制原理
future机制是:在通过线程去执行某个任务的时候,如果比较耗时,我们可以通过futureTask机制,异步返回,继续去执行其他的任务,在需要获取执行结果的时候,通过future.get()方法去获取,如果任务没有执行完毕,会通过lockSupport.park()方法去阻塞主线程,直到run()方法执行完毕之后,会通过lockSupport.unpark()方法去唤醒线程应用public class FutureTest { public static void main(String[] a原创 2021-03-05 08:20:10 · 3098 阅读 · 4 评论 -
LinkedHashMap如何保证有序
我们常说linkedHashMap是有序的,这个有序也是分为两种的,分别是:插入顺序和访问顺序原创 2021-02-28 09:41:35 · 4386 阅读 · 0 评论