
并发编程
文章平均质量分 89
小小小金鱼
只要学不死,就往死里学!!!
展开
-
并发编程之CountDownLatch源码解析
简介CountDownLatch允许一个或多个线程等待其它线程的操作执行完毕后再执行后续的操作。是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后等待的线程就可恢复工作。CountDownLatch的通常用法和Thread.join()有点类似,等待其它线程都完成后再执行主任务。简单使用public class CountDownLatchTest { public static void main原创 2021-03-05 11:41:21 · 241 阅读 · 2 评论 -
并发编程之ReentrantLock--Condition
介绍Condition是条件锁的意思,是指在获取锁之后发现当前业务场景自己无法处理,而需要等待某个条件的出现才可以继续处理时使用的一种锁。最常见的生产者消费者模式,生产的元素都被消费完,则需要阻塞消费者,不可继续消费直到生产者生产新的后唤醒消费者;或者生产者生产过快,容器已满,则需要阻塞生产者,直到消费者消费一定数量才唤醒生产者。Condition是一个接口,其定义如下public interface Condition { //阻塞当前线程,等待同一个Condition对象上的signal()/原创 2021-02-26 16:58:27 · 235 阅读 · 0 评论 -
并发编程之线程状态
线程状态Java语言定义了6种线程状态,在任意一个时间点中,一个线程只能有且只有其中的一种状态,并且可以通过特定的方法在不同状态之间转换。这6种状态分别是:1、新建(New):创建后尚未启动的线程处于这种状态。2、运行(Runnable):包括线程状态中的Running 和Ready,也就是处于此状态的线程有可能正在执行,也有可能正在等待着操作系统为它分配执行时间。3、无限期等待(Waiting ):处于这种状态的线程不会被分配处理器执行时间,它们要等待被其他线程显式唤醒。4、限期等待(Timed原创 2021-02-25 20:42:30 · 3057 阅读 · 0 评论 -
并发编程之ThreadLocal源码解析与内存泄露
ThreadLocal简介多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。ThreadLocal提供线程本地变量,每个线程拥有本地变量的副本,各个线程之间的变量互不干扰。T原创 2021-02-01 16:51:45 · 771 阅读 · 0 评论 -
并发编程之ConcurrentHashMap源码解析(二)
扩容解析addCount操作容器大小后扩容private final void addCount(long x, int check) { ...省略count加减逻辑,详细见上一章节 if (check >= 0) { Node<K,V>[] tab, nt; int n, sc; //sizeCtl 0.75 * 数组长度 且table不为null 且 table长度小于最大值 while原创 2021-01-28 15:03:11 · 478 阅读 · 0 评论 -
并发编程之ConcurrentHashMap源码解析(一)
ConcurrentHashMap简介ConcurrentHashMap是java中并发安全的HashMap,HashMap是我们最常使用的容器,但HashMap是不安全的。在多线程情况下,需使用ConcurrentHashMap。ConcurrentHashMap在jdk1.7底层使用Segment实现分段锁,ConcurrentHashMap底层是Segment数组,而每个Segment对象下面是个小型的HashMap。Segment对象继承ReentrantLock,操作时通过ReentrantLo原创 2021-01-28 10:25:34 · 877 阅读 · 4 评论 -
并发编程之synchronized原理
synchronized是Java中的关键字,是一种同步锁。保证同一时刻最多只有1个线程执行 被Synchronized修饰的方法 / 代码。它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象; 2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象; 3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象; 4. 修原创 2021-01-26 16:27:30 · 351 阅读 · 0 评论 -
并发编程之ReentrantLock AQS原理
简单介绍ReentrantLock是一个可重入且独占式的锁,它具有与使用synchronized监视器锁相同的基本行为和语义,但与synchronized关键字相比,它更灵活、更强大,增加了轮询、超时、中断等高级功能。ReentrantLock,顾名思义,它是支持可重入锁的锁,是一种递归无阻塞的同步机制。除此之外,该锁还支持获取锁时的公平和非公平选择。ReentrantLock底层基于AQS实现锁机制。ReentrantLock中存在抽象类Sync,有两个实现类FairSync公平锁和NonfairS原创 2021-01-22 10:14:13 · 845 阅读 · 0 评论 -
并发编程之线程池源码解读
线程池简介使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。jdk1.5后新增Executors和ThreadPoolExecutor类,是Java提供的用于管理线程池的类。三种常见的线程池详解创建线程池 //可缓存线程池 ExecutorService newCachedThreadPool = Execu原创 2021-01-15 16:10:39 · 723 阅读 · 0 评论