并发编程
文章平均质量分 67
3个字,让你看了3个字
人生归离复归离,借一浮生逃浮生
展开
-
Semaphore源码解析
Semaphore源码解析简介Semaphore是常用的同步工具之一,我们设置n,代表同一时间最多只有n个线程在访问这个工具依赖AQS实现,所以在看源码前推荐先去看AQS的介绍,方便理解public class SemaphoneTest { private Semaphore semaphore = new Semaphore(5); private ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 15, 60, TimeUni原创 2022-02-11 15:24:53 · 438 阅读 · 0 评论 -
阻塞队列(三)—— LinkedBlockingDeque源码
标题LinkedBlockingDeque源码简介LinkedBlockingDeque是一个双端队列,可以消费队头以及队尾的元素,我们可以设定最大容量,但是设定好后不可改变,因为被final修饰了,然后没有设置的话默认是Integer的最大值,只有一把锁和两个条件队列下面来看看源码源码首先是重要内部类 //Node节点 static final class Node<E> { //元素value E item; //前继节点原创 2022-02-11 14:23:46 · 496 阅读 · 0 评论 -
阻塞队列(二)——LinkedBlockingQueue源码
标题LinkedBlockingQueue源码简介LinkedBlockingQueue是一个基于单向链表实现的阻塞队列,是先进先出的,然后至少包含一个元素,同时不支持null值的元素,持有两把锁,分别用于管控队头出队,队尾入队然后来看他的源码静态内部类 //静态内部类 static class Node<E> { //元素 E item; //下一个Node节点 Node<E> nex原创 2022-02-11 10:58:21 · 315 阅读 · 0 评论 -
线程池源码解析
线程池源码解析线程池的作用一方面当执行大量异步任务时候线程池能够提供较好的性能,在不使用线程池的时候,每当需要执行异步任务时候是直接 new 一线程进行运行,而线程的创建和销毁是需要开销的。使用线程池时候,线程池里面的线程是可复用的,不会每次执行异步任务时候都重新创建和销毁线程。另一方面线程池提供了一种资源限制和管理的手段,比如可以限制线程的个数,动态新增线程等,每个 ThreadPoolExecutor 也保留了一些基本的统计数据,比如当前线程池完成的任务数目等。ThreadPoolExecuto原创 2022-02-10 14:53:25 · 670 阅读 · 0 评论 -
CountDownLatch源码解析
CountDownLatch源码解析CountDownLatch 允许一个或多个线程等待其他线程完成操作。使用示例public class CountDownLatchTest { public static void main(String[] args) { final CountDownLatch latch = new CountDownLatch(2); System.out.println("主线程开始执行…… ……"); //第一原创 2022-02-09 15:49:13 · 554 阅读 · 0 评论 -
Condition源码讲解
Condition是一个等待队列,作用类似与我们Object类中的wait()以及notify()方法,作用都是用于线程的唤醒与等待Condition比我们在Object中的等待队列作用要更强大,更灵活,像我们的ConditionObject可以利用newCondition()来产生多个等待队列下面来介绍Condition的源码与实现首先是接口Condition,它定义了我们的Condition的基本功能public interface Condition { //常用的线程挂起等待的方原创 2022-02-09 11:32:59 · 670 阅读 · 0 评论 -
动态线程池
动态线程池1.1 线程池是什么线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。而本文描述线程池是JDK中提供的ThreadPoolExecutor类。当然,使转载 2022-02-08 14:47:11 · 2461 阅读 · 0 评论 -
ReentrantLock源码解析
ReentrantLock源码解析ReentrantLock是一个轻量级锁,主要采用同步队列,以及CAS去进行资源的争夺重要内部类Sync //重要,我们的ReentrantLock的加锁解锁基本靠这个 abstract static class Sync extends AbstractQueuedSynchronizer { //加锁方法,被abstract修饰,需要子类实现 abstract void lock(); //不公平的尝试获取锁,final修饰,代表不能被重写原创 2022-01-21 17:38:25 · 672 阅读 · 0 评论 -
AQS源码解析
AQS源码解析一、AQS是干什么的?AQS是一个同步抽象队列,简单来说就是一个队列,而且是FIFO的双向队列,也就是AbstractQueuedSynchronizer这个类队列的话肯定会有节点,它又是一个同步性质的队列,所以他的节点就是由我们想要获取锁这种资源的线程包装而来的我们的线程会然后尝试获取同步状态,没有获取成功的会被包装成Node节点,然后加入到我们的队列,并进入等待状态,直到被唤醒那么他们想获取到的资源是什么呢?在AQS中,有一个被volatile修饰的state变量,这个就是我们原创 2022-01-20 17:58:52 · 472 阅读 · 0 评论 -
ThreadLocal源码深度解析
一、介绍ThreadLocal叫做线程本地变量,会给每个线程都分配一个属于自己的本地变量,用于线程变量隔离,保证线程安全每个线程内部都会有自己的一个ThreadLocalMap,然后key是ThreadLocal,Value是我们自己设定的值,注意Entry中Key是弱引用,弱引用是发现就回收,继承了WeakReference这个,但是V不是,所以这里可能会产生简图Thread.class /* ThreadLocal values pertaining to this thread. Thi原创 2022-01-17 17:45:47 · 402 阅读 · 0 评论