From c2de35b90d1a65720f1cbb908223db0624905c4e Mon Sep 17 00:00:00 2001 From: mengyxu Date: Wed, 23 Feb 2022 15:29:36 +0800 Subject: [PATCH] update --- 1.java/2.多线程知识整理.md | 43 ++++++++++++++++++- .../{ => SpringBoot}/11.Spring boot基础.md | 0 .../12.Spring boot整合mongodb.md | 0 6.数据库/2.mongodb.md | 0 4 files changed, 42 insertions(+), 1 deletion(-) rename 1.java/{ => SpringBoot}/11.Spring boot基础.md (100%) rename 1.java/{ => SpringBoot}/12.Spring boot整合mongodb.md (100%) create mode 100644 6.数据库/2.mongodb.md diff --git a/1.java/2.多线程知识整理.md b/1.java/2.多线程知识整理.md index 9dc7c2c..2e23a67 100644 --- a/1.java/2.多线程知识整理.md +++ b/1.java/2.多线程知识整理.md @@ -170,4 +170,45 @@ FieldUpdater类型: - AtomicIntegerFieldUpdater 原子更新整形字段的更新器 - AtomicLongFieldUpdater 原子更新长整形字段的更新器 -- AtomicReferenceFieldUpdater 原子更新引用类型字段的更新器 \ No newline at end of file +- AtomicReferenceFieldUpdater 原子更新引用类型字段的更新器 + +## Atomic类基本实现原理 + +以AtomicIntger 为例:方法getAndIncrement:以原子方式将当前的值加1,具体实现为: + +- 在 for 死循环中取得 AtomicInteger 里存储的数值 +- 对 AtomicInteger 当前的值加 1 +- 调用 compareAndSet 方法进行原子更新 +- 先检查当前数值是否等于 expect +- 如果等于则说明当前值没有被其他线程修改,则将值更新为 next, +- 如果不是会更新失败返回 false,程序会进入 for 循环重新进行 compareAndSet 操作。 + +## CountDownLatch + +countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,调用countDown方法,计数器的值就减1,当计数器的值为0时,表示所有线程都执行完毕,然后在等待的线程就可以恢复工作了。只能一次性使用,不能 reset。 + +## CyclicBarrier + +从字面上的意思可以知道,这个类的中文意思是“循环栅栏”。大概的意思就是一个可循环利用的屏障。 + +作用就是会让所有线程都等待完成后才会继续下一步行动 + +## Semaphore + +Semaphore 即信号量。Semaphore 的构造方法参数接收一个 int 值,设置一个计数器,表示可用的许可数量即最大并发数。使用 acquire 方法获得一个许可证,计数器减一,使用 release 方法归还许可,计数器加一。如果此时计数器值为0,线程进入休眠。 + +## Exchanger + +Exchanger 类可用于两个线程之间交换信息。可简单地将 Exchanger 对象理解为一个包含两个格子的容器,通过 exchanger 方法可以向两个格子中填充信息。线程通过 exchange 方法交换数据,第一个线程执行 exchange 方法后会阻塞等待第二个线程执行该方法。当两个线程都到达同步点时这两个线程就可以交换数据当两个格子中的均被填充时,该对象会自动将两个格子的信息交换,然后返回给线程,从而实现两个线程的信息交换。 + +## ConcurrentHashMap + +和 HashMap 非常类似,唯一的区别就是其中的核心数据如 value ,以及链表都是 volatile 修饰的,保证了获取时的可见性。 + +ConcurrentHashMap 采用了分段锁技术,其中 Segment 继承于 ReentrantLock。不会像 HashTable 那样不管是 put 还是 get 操作都需要做同步处理,理论上 ConcurrentHashMap 支持 CurrencyLevel (Segment 数组数量)的线程并发。每当一个线程占用锁访问一个 Segment 时,不会影响到其他的 Segment + +JDK8 的改进 + +- 取消分段锁机制,采用 CAS 算法进行值的设置,如果 CAS 失败再使用 synchronized 加锁添加元素 +- 引入红黑树结构,当某个槽内的元素个数超过8且 Node 数组 容量大于 64 时,链表转为红黑树。 +- 使用了更加优化的方式统计集合内的元素数量。 \ No newline at end of file diff --git a/1.java/11.Spring boot基础.md b/1.java/SpringBoot/11.Spring boot基础.md similarity index 100% rename from 1.java/11.Spring boot基础.md rename to 1.java/SpringBoot/11.Spring boot基础.md diff --git a/1.java/12.Spring boot整合mongodb.md b/1.java/SpringBoot/12.Spring boot整合mongodb.md similarity index 100% rename from 1.java/12.Spring boot整合mongodb.md rename to 1.java/SpringBoot/12.Spring boot整合mongodb.md diff --git a/6.数据库/2.mongodb.md b/6.数据库/2.mongodb.md new file mode 100644 index 0000000..e69de29