红黑树
自平衡二叉查找树 — 时间复杂度O(logn)
特征:
- 每一个节点非红即黑
- 根节点一定是黑色
- 所有的叶子节点一定是黑色的nil节点
- 红节点的子节点一定是黑节点
- 任意一条路径中的黑色节点个数一致
- 插入的节点一定是红色
修复:
- 当前节点为红,并且父节点且叔父节点为红,那么将父节点以及叔父
节点涂黑,然后将祖父节点涂红 - 当前节点为红,并且父节点为红且叔父节点为黑,当前节点为右子
叶,以当前节点为轴进行左旋 - 当前节点为红,并且父节点为红且叔父节点为黑,当前节点为左子
叶,以父节点为轴进行右旋
ConcurrentNavigableMap - 并发导航映射
本身是一个接口,所以更多的是使用实现类 - ConcurrentSkipListMap - 并发
跳跃表映射
跳跃表:为了提高查询效率所产生一种数据结构 — 跳跃表是典型的以空
间换时间的产物

如果跳跃表中插入新的元素,新的元素是否往上提取遵循"抛硬币"原则 —
1/2原则 - 只要保证这个节点有一半的概率被提取就可以
跳跃表适合于大量查询而不增删的场景
扩展:B+树是MySQl的索引的建立机制
锁
CountDownLatch - 闭锁 - 线程递减锁 - 对线程进行计数,当计数归零的时
候会放开阻塞让线程继续往下执行

package cn.tedu.concurrent.lock;
import java.util.concurrent.CountDownLatch;
CountDownLatch cdl = new CountDownLatch(5);
new Thread(new Teacher(cdl)).start();
new Thread(new Student(cdl)).start();
public static void main(String[] args) throws InterruptedException {
public class CountDownLatchDemo {
分区 Concurrent 的第 3 页
new Thread(new Student(cdl)).start();
new Thread(new Student(cdl)).start();
new Thread(new Student(cdl)).start();
new Thread(new Student(cdl)).start();
// 表示让线程阻塞,直到计数归零的时候阻塞才能放开
cdl.await();
System.out.println("考试结束~~~");
}
}
private CountDownLatch cdl;
class Student implements Runnable {
this.cdl = cdl;
public Student(CountDownLatch cdl) {
}
@Override
System.out.println("学生来到考场,准备考试~~~");
Thread.sleep(1000);
try {
e.printStackTrace();
} catch (InterruptedException e) {
}
System.out.println("学生交卷离开考场");
// 计数-1
cdl.countDown();
public void run() {
}
}
private CountDownLatch cdl;
class Teacher implements Runnable {
this.cdl = cdl;
public Teacher(CountDownLatch cdl) {
}
@Override
public void run() {
System.out.println("老师来到考场,准备考试~~~");
Thread.sleep(5000);
try {
e.printStackTrace();
} catch (InterruptedException e) {
}
System.out.println("老师收卷离开了考场~~~");
cdl.countDown();
}
}
CyclicBarrier - 栅栏 - 当所有的线程都到达了同一个点之后才继续往下执行

package cn.tedu.concurrent.lock;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
CyclicBarrier cb = new CyclicBarrier(4);
new Thread(new Runner(cb), "1号").start();
new Thread(new Runner(cb), "2号").start();
new Thread(new Runner(cb), "3号").start();
new Thread(new Runner(cb), "4号").start();
public static void main(String[] args) {
}
}
private CyclicBarrier cb;
this.cb = cb;
public Runner(CyclicBarrier cb) {
}
class Runner implements Runnable
本文介绍了红黑树作为自平衡二叉查找树的特性及其插入修复策略。同时,讨论了并发导航映射ConcurrentNavigableMap,如ConcurrentSkipListMap,以及线程同步组件如CountDownLatch、CyclicBarrier和Exchanger。还涉及到了线程池的工作原理、ScheduledExecutorService、分叉合并算法以及Lock和原子性操作在多线程环境中的重要性。
最低0.47元/天 解锁文章
459

被折叠的 条评论
为什么被折叠?



