Compare commits

...

6 Commits

Author SHA1 Message Date
Guide 22f13d0429
Merge pull request #2386 from TedLau/patch-6
Update limit-request.md
2024-05-06 21:36:33 +08:00
Guide 62a6a45d05
Merge pull request #2387 from firgk/main
Update java-concurrent-questions-01.md
2024-05-06 21:35:58 +08:00
Guide 588f3818fd
Merge pull request #2388 from Zzr-rr/main
Update concurrent-hash-map-source-code.md
2024-05-06 21:34:29 +08:00
Zzr-rr be55c433c0 concurrencyHashMap源码分析错别字勘误 2024-05-06 16:47:03 +08:00
firgk 16275c8271
Update java-concurrent-questions-01.md
这些线程可以被映射到底层多个 CPU 上执行->这些线程可以被映射到底层多个 CPU 核心上执行
2024-05-06 15:13:23 +08:00
TedLau e54ce07e8c
Update limit-request.md
似乎应该是“中间件框架”,而非“中间件架”
2024-05-05 17:22:35 +08:00
3 changed files with 4 additions and 4 deletions

View File

@ -239,7 +239,7 @@ Resilience4j 不仅提供限流,还提供了熔断、负载保护、自动重
分布式限流常见的方案:
- **借助中间件架限流**:可以借助 Sentinel 或者使用 Redis 来自己实现对应的限流逻辑。
- **借助中间件架限流**:可以借助 Sentinel 或者使用 Redis 来自己实现对应的限流逻辑。
- **网关层限流**:比较常用的一种方案,直接在网关层把限流给安排上了。不过,通常网关层限流通常也需要借助到中间件/框架。就比如 Spring Cloud Gateway 的分布式限流实现`RedisRateLimiter`就是基于 Redis+Lua 来实现的,再比如 Spring Cloud Gateway 还可以整合 Sentinel 来做限流。
如果你要基于 Redis 来手动实现限流逻辑的话,建议配合 Lua 脚本来做。

View File

@ -328,7 +328,7 @@ private void rehash(HashEntry<K,V> node) {
HashEntry<K,V> e = oldTable[i];
if (e != null) {
HashEntry<K,V> next = e.next;
// 计算新的位置,新的位置只可能是不便或者是老的位置+老的容量。
// 计算新的位置,新的位置只可能是不或者是老的位置+老的容量。
int idx = e.hash & sizeMask;
if (next == null) // Single node on list
// 如果当前位置还不是链表,只是一个元素,直接赋值
@ -337,7 +337,7 @@ private void rehash(HashEntry<K,V> node) {
// 如果是链表了
HashEntry<K,V> lastRun = e;
int lastIdx = idx;
// 新的位置只可能是不便或者是老的位置+老的容量。
// 新的位置只可能是不或者是老的位置+老的容量。
// 遍历结束后lastRun 后面的元素位置都是相同的
for (HashEntry<K,V> last = next; last != null; last = last.next) {
int k = last.hash & sizeMask;

View File

@ -228,7 +228,7 @@ new 一个 `Thread`,线程进入了新建状态。调用 `start()`方法,会
再深入到计算机底层来探讨:
- **单核时代**:在单核时代多线程主要是为了提高单进程利用 CPU 和 IO 系统的效率。 假设只运行了一个 Java 进程的情况,当我们请求 IO 的时候,如果 Java 进程中只有一个线程,此线程被 IO 阻塞则整个进程被阻塞。CPU 和 IO 设备只有一个在运行,那么可以简单地说系统整体效率只有 50%。当使用多线程的时候,一个线程被 IO 阻塞,其他线程还可以继续使用 CPU。从而提高了 Java 进程利用系统资源的整体效率。
- **多核时代**: 多核时代多线程主要是为了提高进程利用多核 CPU 的能力。举个例子:假如我们要计算一个复杂的任务,我们只用一个线程的话,不论系统有几个 CPU 核心,都只会有一个 CPU 核心被利用到。而创建多个线程,这些线程可以被映射到底层多个 CPU 上执行,在任务中的多个线程没有资源竞争的情况下,任务执行的效率会有显著性的提高,约等于(单核时执行时间/CPU 核心数)。
- **多核时代**: 多核时代多线程主要是为了提高进程利用多核 CPU 的能力。举个例子:假如我们要计算一个复杂的任务,我们只用一个线程的话,不论系统有几个 CPU 核心,都只会有一个 CPU 核心被利用到。而创建多个线程,这些线程可以被映射到底层多个 CPU 核心上执行,在任务中的多个线程没有资源竞争的情况下,任务执行的效率会有显著性的提高,约等于(单核时执行时间/CPU 核心数)。
### 使用多线程可能带来什么问题?