Java并发
xiaoxiao学Java
这个作者很懒,什么都没留下…
展开
-
对于默认的四个线程池的原理及其使用场景理解
newFixedThreadPool:是一个定长线程池,也就是核心线程数和最大线程数相等,阻塞队列采用LinkedBlockingQueue,是一个无界队列使用场景:适用于CPU密集型的任务,已有的线程数量已经可以充分的利用CPU的性能,不需要再去创建额外的线程缺点:当大量的任务提交过来时可能会造成一个任务的大量堆积,从而导致阻塞队列的元素过多造成占用一个大量的内存newCachedThreadPool:阻塞队列采用的是SynchronizedQueue,是一个容量为零的队列,也就是说每当一个生产线程原创 2021-12-13 22:23:49 · 640 阅读 · 0 评论 -
对于排序二叉树删除节点的一些理解
1、删除叶子节点,这个没有什么特别的地方,找到目标节点然后通过父节点进行删除就可以了2、删除有一颗子树的节点,先找到目标节点target,然后找到目标节点的父节点parent,分为几种情况1)target是parent的左子树,target有左子树比如说这个,我们要删除8的话,直接让parent.left = target.left就可以了,其他三种情况,也是一样的2)target是parent的左子树,target有右子树我们删除6,就是parent.left = target.right原创 2021-10-10 10:54:35 · 375 阅读 · 0 评论 -
对AQS的源码解析理解
我们使用常用的ReentrantLock来解析AQS是怎么工作的,仅仅是自己的一些理解,希望大家指正。首先我们进入lock()我们发现,源码中是使用了一个sync.lock()来调用的,那么sync是什么呢?我们跟踪源码发现sync是ReentrantLock中的一个属性,而Sync类就是继承了我们说的AQS,这也就说明了ReentrantLock其实就是使用AQS来做到一个对于线程的阻塞和通知唤醒的管理的。我们接着向下看。我们发现sync.lock()进来之后是一个抽象方法,这其实是一种模.原创 2021-10-04 15:13:58 · 61 阅读 · 0 评论 -
关于ThreadLocal为什么采用弱引用的理解
ThreadLocal为每一个线程提供了一个私有的变量,这个现象是依托于ThreadLocalMap来实现的,map中的每一个Entry的key都是指向了一个threadlocal,这是一个弱引用,当外界对指向threadlocal的强引用回收之后,就说明这个threadlocal就没用了,但是此时还有map中的key也指向了它,若是这个key是一个强引用,那么我们就无法对threadlocal进行回收,就有可能造成一个内存泄漏的问题,所以使用了弱引用来解决这个问题,只有弱引用指向的对象,在下次垃圾回收时就原创 2021-09-26 21:46:11 · 3901 阅读 · 1 评论 -
关于AQS中的state属性的一些理解
protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (!hasQueuedPredecessors() && compareAndSe原创 2021-09-16 09:53:16 · 1561 阅读 · 0 评论 -
对于synchronized锁升级的理解
在jdk1.6之前synchronized重量级锁的观念深入人心,之前我也一直以为synchronized时重量级锁,效率很差,但是前段时间阅读了Java并发编程艺术这本书,才知道jdk1.6之后synchronized引入了锁升级的机制,synchronized不再是单纯的重量级锁了。我们可以将锁分为三类:偏向锁,轻量级锁,重量级锁此处是一些自己的理解,就不说一些难以理解的话了,若是想要深入理解原理,可以参考Java并发编程艺术这本书偏向锁:当一个线程来访问一个同步代码块时,如果时第一次有线程来访问原创 2021-09-09 12:16:39 · 92 阅读 · 0 评论