随笔分类 - 并发编程
摘要:目录: 类图 submit方法(RunnableFuture接口newTaskFor方法) FutureTask类 声明。 核心属性:任务运行状态、核心属性。 构造器。 核心方法。 类图 上节课我们说到了execute方法,此方法虽然可以将任务让如线程池中运行,但却不能返回线程执行的结果,所以针对于
阅读全文
摘要:目录: execute() addWorker() execute() 1 public void execute(Runnable command) { 2 if (command == null) 3 throw new NullPointerException(); 4 /* 5 * 处理过程
阅读全文
摘要:目录: 位运算复习 线程池状态解析 位运算复习 原码:一个整数的绝对值转换成二进制,若此数为整数最高位为0,为负数最高位为1。 反码:除最高位的整数标记外,其它数均由0变1,1变0。 补码:反码+1。 注:计算机中不管正数还是负数都用二进制的补码表示,正数的原码、反码、补码都一样。 ————————
阅读全文
摘要:目录: corePoolSize:核心线程数量 workQueue:阻塞队列 maximumPoolSize:最大线程数量 threadFactory:线程工厂 handler:拒绝、饱和策略 线程池执行原理图 1 public ThreadPoolExecutor(int corePoolSize
阅读全文
摘要:目录: ThreadPoolExecutor架构及类结构 工作线程Worker源码解析 总结 ThreadPoolExecutor架构及类结构 从上图来说ThreadPoolExecutor的锁同步是通过AQS来实现的。 注意:想要读懂ThreadPoolExecutor源码你先了解一下知识点: A
阅读全文
摘要:目录: CAS操作步骤 CAS极端情况下可能会导致的问题:ABA ABA问题的影响 JUC是如何解决ABA问题的 CAS操作步骤 CAS:compare and swap,即比较后再交换。它是一种无锁的算法,操作如下: 从内存获取V的值。 拿到旧的预期值A。 拿到要修改的值B。 当且仅当预期值A和内
阅读全文
摘要:目录: 原子操作是什么、什么是AtomicInteger JUC提供的原子类 AtomicInteger的使用 AtomicInteger源码简述 原子操作是什么、什么是AtomicInteger 原子操作,是一种不会被线程调度机制所打断的操作,这种操作一旦开始,就会一直运行到结束,中间不会有任何上
阅读全文
摘要:目录: 什么是Unsafe、为什么要有Unsafe Unsafe源码简述 什么是Unsafe、为什么要有Unsafe 我们知道Java和C、C++这种语言最大的差别就是Java不能直接操作内存,而C、C++可以;但其实在某些场景下我们为了进一步提升效率我们不得不直接操作内存。 而Unsafe就提供了
阅读全文
摘要:目录: 属性及内部类 构造函数 核心方法 属性及内部类 1、属性: 其实说到属性最终要的也无法就是一个hash数组桶,其它核心的属性都是大同小异。 1 transient volatile Node<K,V>[] table; 2、Node:ConcurrentHashMap存储数据的基本单元。 1
阅读全文
摘要:目录: 什么是ConcurrentHashMap 为什么要有ConcurrentHashMap ConcurrentHashMap源码解析 什么是ConcurrentHashMap ConcurrentHashMap,从名字上就可以看出它是一个处理并发情况的哈希表,和HashMap非常像,你可以把它
阅读全文
摘要:目录: 学习准备 类核心属性、内部类、构造函数介绍 哈希冲突(哈希碰撞) put()方法源码分析 resize()方法源码分析 学习准备 在阅读Java8 HashMap前你需要掌握数组、链表、二叉树、哈希表等知识。 我这里来简单的介绍一下它们: 数组:是通过一组连续的存储单元来存储数据的一种结构,
阅读全文
摘要:目录: HashMap结构 HashMap方法简述 HashMap结构 在Java7中我们可以更具HashMap的table属性及Entry内部类观察出,其底层是基于数组实现,并在发生Hash冲突的时候用链表解决,将相同hash值的key组层一个链表维护。 1 transient Entry<K,V
阅读全文
摘要:目录: CopyOnWriteArrayList是什么 为什么要有CopyOnWriteArrayList 如何使用CopyOnWriteArrayList CopyOnWriteArrayList源码分析 CopyOnWriteArrayList是什么 CopyOnWriteArrayList是一
阅读全文
摘要:目录: 什么是DelayQueue 如何使用DelayQueue 总结 什么是DelayQueue DelayQueue是一个支持延时获取元素的无界阻塞队列,队列使用PriorityQueue来实现。 队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素,只有在延
阅读全文
摘要:目录: 什么是ArrayBlockingQueue 为什么要有ArrayBlockingQueue 如何使用ArrayBlockingQueue ArrayBlockingQueue源码分析 LinkedBlockingQueue源码分析 什么是ArrayBlockingQueue 首先在说明Arr
阅读全文
摘要:目录: 什么是CyclicBarrier 为什么要有CyclicBarrier 如何使用CyclicBarrier CyclicBarrier源码解析 什么是CyclicBarrier CyclicBarrier是循环栅栏,它的作用就是会让所有线程都等待完成后才会继续下一步行动。 与CountDow
阅读全文
摘要:目录: CountDownLatch是什么 为什么要有CountDownLatch CountDownLatch源码分析 CountDownLatch是什么 CountDownLatch是一种闭锁,也叫倒数计数器,它可以等待多个线程执行完毕后再执行某一件事情。 比如你app的首页要加载很多个模块,而
阅读全文
摘要:目录: Semaphore简介 内部类(Sync、NonfairSync、FairSync) 属性及构造器 其它方法 Semaphore简介 Semaphore是信号量,它是synchronized的加强版,作用是控制线程的并发数量。就这一点而言,单纯的synchronized关键字是实现不了的。
阅读全文
摘要:目录: 什么是ReentrantLock ReentrantLock源码解析 总结 什么是ReentrantLock ReentrantLock是可重入锁,指当一个线程获取某个对象时还能再次获得该对象,重入是指重入某对象的锁。 那什么时候会用到可重入锁呢? 1 public class Demo {
阅读全文
摘要:目录: await()第二部分解析 如何处理线程被唤醒到竞争到锁的这段时间发生的中断 AQS总结 await()第二部分解析 之前我们说到线程在接收到signal()的通知后会从调用await()之处执行,但这里需要注意的是我们被唤醒的时候,其实并不知道是因为什么原因被唤醒的。 有可能是其它线程调用
阅读全文

浙公网安备 33010602011771号