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