1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-08-10 00:41:37 +08:00

Compare commits

...

8 Commits

Author SHA1 Message Date
Guide
d737d39256
Merge pull request #2104 from Simon-Ace/patch-1
Update jmm.md  i++ 误写为 1++
2023-08-01 18:13:04 +08:00
Guide
16be7c3cac
Merge pull request #2103 from goto456/goto456-patch-1
Update rocketmq-questions.md
2023-08-01 18:12:23 +08:00
Guide
132bf5c65f
Merge pull request #2102 from liuxiaocs7/liuxiaocs7-patch-2
Update java-concurrent-questions-02.md
2023-08-01 18:11:28 +08:00
Guide
9ac4e6c1af
Merge pull request #2105 from JacketFu/main
update hashmap-source-code.md
2023-08-01 18:10:52 +08:00
jun
07a085285b update hashmap-source-code.md 2023-08-01 17:08:33 +08:00
Simon Ace
f4b65f50fc
Update jmm.md i++ 误写为 1++ 2023-08-01 11:55:13 +08:00
goto456
698acfbc57
Update rocketmq-questions.md
修复错误
2023-08-01 10:55:06 +08:00
Liu Xiao
8efc9a54f1
Update java-concurrent-questions-02.md 2023-07-31 23:05:29 +08:00
4 changed files with 6 additions and 5 deletions

View File

@ -348,7 +348,7 @@ emmm就两个字—— **幂等** 。在编程中一个*幂等* 操作的特
![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/16ef387d939ab66d.jpg)
## 什么回溯消费?
## 什么回溯消费?
回溯消费是指 `Consumer` 已经消费成功的消息,由于业务上需求需要重新消费,在`RocketMQ` 中, `Broker` 在向`Consumer` 投递成功消息后,**消息仍然需要保留** 。并且重新消费一般是按照时间维度,例如由于 `Consumer` 系统故障,恢复后需要重新消费 1 小时前的数据,那么 `Broker` 要提供一种机制,可以按照时间维度来回退消费进度。`RocketMQ` 支持按照时间回溯消费,时间维度精确到毫秒。

View File

@ -453,7 +453,8 @@ final Node<K,V>[] resize() {
// 只有一个节点,直接计算元素新的位置即可
newTab[e.hash & (newCap - 1)] = e;
else if (e instanceof TreeNode)
// 将红黑树拆分成2棵子树拆分后的子树节点数小于等于6则将树转化成链表
// 将红黑树拆分成2棵子树如果子树节点数小于等于 UNTREEIFY_THRESHOLD默认为 6则将子树转换为链表。
// 如果子树节点数大于 UNTREEIFY_THRESHOLD则保持子树的树结构。
((TreeNode<K,V>)e).split(this, newTab, j, oldCap);
else {
Node<K,V> loHead = null, loTail = null;

View File

@ -219,8 +219,8 @@ sum.increment();
理论上来说:
- 悲观锁通常多用于写比较多的情况(多写场景,竞争激烈),这样可以避免频繁失败和重试影响性能,悲观锁的开销是固定的。不过,如果乐观锁解决了频繁失败和重试这个问题的话(比如`LongAdder`),也是可以考虑使用乐观锁的,要视实际情况而定。
- 乐观锁通常多于写比较少的情况(多读场景,竞争较少),这样可以避免频繁加锁影响性能。不过,乐观锁主要针对的对象是单个共享变量(参考`java.util.concurrent.atomic`包下面的原子变量类)。
- 悲观锁通常多用于写比较多的情况(多写场景,竞争激烈),这样可以避免频繁失败和重试影响性能,悲观锁的开销是固定的。不过,如果乐观锁解决了频繁失败和重试这个问题的话(比如`LongAdder`),也是可以考虑使用乐观锁的,要视实际情况而定。
- 乐观锁通常多于写比较少的情况(多读场景,竞争较少),这样可以避免频繁加锁影响性能。不过,乐观锁主要针对的对象是单个共享变量(参考`java.util.concurrent.atomic`包下面的原子变量类)。
### 如何实现乐观锁?

View File

@ -32,7 +32,7 @@ JMM(Java 内存模型)主要定义了对于一个共享变量,当另一个线
现代的 CPU Cache 通常分为三层,分别叫 L1,L2,L3 Cache。有些 CPU 可能还有 L4 Cache这里不做讨论并不常见
**CPU Cache 的工作方式:** 先复制一份数据到 CPU Cache 中,当 CPU 需要用到的时候就可以直接从 CPU Cache 中读取数据,当运算完成后,再将运算得到的数据写回 Main Memory 中。但是,这样存在 **内存缓存不一致性的问题** !比如我执行一个 i++ 操作的话,如果两个线程同时执行的话,假设两个线程从 CPU Cache 中读取的 i=1两个线程做了 1++ 运算完之后再写回 Main Memory 之后 i=2而正确结果应该是 i=3。
**CPU Cache 的工作方式:** 先复制一份数据到 CPU Cache 中,当 CPU 需要用到的时候就可以直接从 CPU Cache 中读取数据,当运算完成后,再将运算得到的数据写回 Main Memory 中。但是,这样存在 **内存缓存不一致性的问题** !比如我执行一个 i++ 操作的话,如果两个线程同时执行的话,假设两个线程从 CPU Cache 中读取的 i=1两个线程做了 i++ 运算完之后再写回 Main Memory 之后 i=2而正确结果应该是 i=3。
**CPU 为了解决内存缓存不一致性问题可以通过制定缓存一致协议(比如 [MESI 协议](https://zh.wikipedia.org/wiki/MESI%E5%8D%8F%E8%AE%AE))或者其他手段来解决。** 这个缓存一致性协议指的是在 CPU 高速缓存与主内存交互的时候需要遵守的原则和规范。不同的 CPU 中,使用的缓存一致性协议通常也会有所不同。