艰难的红黑树学习笔记
红黑树定义 红黑树是自平衡的二叉查找树,在进行插入和删除等可能会破坏树的平衡的操作时,需要重新自处理达到平衡状态。 红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质: 每个节点要么是黑色,要么是红色。 根节点是黑色。 每个叶子节点(NIL)是黑色,叶子节点是为NULL的节点。 ...
Read more
J.U.C之并发容器(CopyOnWriteArrayList, ConcurrentHashMap)
并发容器和同步容器 同步容器 同步容器常见的有Vector,HashTable等,这些类实现线程安全的方式是:将它们的状态封装起来,并对每个公有方法都进行同步(使用synchronized关键字来修饰)使得每次只有一个线程能访问容器的状态。 在多线程场景下,能安全的使用同步容器所附带的方法,但是 ...
Read more
[转] Fork/Join框架
概述 Fork/Join 框架是 Java 7 提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。 通过 Fork 和 Join 这两个单词来理解下 Fork/Join 框架,Fork 就是把一个大任务切分为若干子任务并行的执行, ...
Read more
[转] J.U.C之线程池
背景 线程池化主要因为普通方式创建线程的弊端以及线程池的优势: 普通方式创建线程弊端 每次new Thread新建对象,性能差; 线程缺乏统一的管理,可能无限制创建线程,相互竞争,有可能占用过多的系统资源导致OOM; 缺乏更多的功能,例如定期执行,线程中断。 线程池的优势 资源可控性:使 ...
Read more
J.U.C 之阻塞队列
概述 在编程中接触的队列更多的为非阻塞队列,例如PriorityQueue,LinkedList。这些队列不会对当前线程进行阻塞,那么在面对类似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略(例如使用Object::wait,Object::notify来实现线程阻塞)。阻塞队 ...
Read more
J.U.C之Callable, Future, FutureTask
概述 创建线程通过有两者方式:一种是继承Thread,一种是实现Runnable接口。但是着两种方式都存在着一个不足,即执行完任务之后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果。 自从Java1.5开始,就提供了Callable和Future,通过它 ...
Read more
J.U.C之常用同步器(ReentrantLock, CountDownLatch, Semaphore, CyclicBarrier, Condition)源码分析
常用同步器 J.U.C中许多常用同步器都是基于AQS实现,主要有以下:CountDownLatch,Semaphore,CyclicBarrier,ReentrantLock,Condition。 下面对上述同步器进行源码分析, 源码分析下基于JDK 8。 ReentrantLock 概述 R ...
Read more
J.U.C之AQS源码学习
AQS(AbstractQueuedSynchronizer) 概述 AQS 提供了一种实现阻塞锁和一系列依赖FIFO同步队列的同步器的框架,ReentrantLock,CountDownLatch等等都是基于AQS的基础上实现的。 使用AQS去实现自定义的同步器时,我们只需要实现对共享资源的获 ...
Read more
对象的共享
可见性 可见性是指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。 在多线程下,面临一个问题就是,无法确保执行读操作的线程能适时地看到其他线程写入的值。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制。 public class NoVisibility { ...
Read more
经典排序算法
排序算法概述 算法分类 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序; 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 以下是常 ...
Read more