Skip to content

Commit 0e97441

Browse files
committed
[docs update]缓存开源项目模块添加 OHC
1 parent 36f59d4 commit 0e97441

File tree

9 files changed

+39
-66
lines changed

9 files changed

+39
-66
lines changed

docs/cs-basics/data-structure/linear-data-structure.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ tag:
9797
插入删除:O1//顶端插入和删除元素
9898
```
9999

100-
![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/栈.png)
100+
![](https://oss.javaguide.cn/github/javaguide/cs-basics/data-structure/%E6%A0%88.png)
101101

102102
### 3.2. 栈的常见应用常见应用场景
103103

@@ -107,7 +107,7 @@ tag:
107107

108108
我们只需要使用两个栈(Stack1 和 Stack2)和就能实现这个功能。比如你按顺序查看了 1,2,3,4 这四个页面,我们依次把 1,2,3,4 这四个页面压入 Stack1 中。当你想回头看 2 这个页面的时候,你点击回退按钮,我们依次把 4,3 这两个页面从 Stack1 弹出,然后压入 Stack2 中。假如你又想回到页面 3,你点击前进按钮,我们将 3 页面从 Stack2 弹出,然后压入到 Stack1 中。示例图如下:
109109

110-
![栈实现浏览器倒退和前进](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/栈实现浏览器倒退和前进.png)
110+
![栈实现浏览器倒退和前进](https://oss.javaguide.cn/github/javaguide/cs-basics/data-structure/%E6%A0%88%E5%AE%9E%E7%8E%B0%E6%B5%8F%E8%A7%88%E5%99%A8%E5%80%92%E9%80%80%E5%92%8C%E5%89%8D%E8%BF%9B.png)
111111

112112
#### 3.2.2. 检查符号是否成对出现
113113

docs/cs-basics/data-structure/tree.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ tag:
1515

1616
下图就是一颗树,并且是一颗二叉树。
1717

18-
![二叉树](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/二叉树-2.png)
18+
![二叉树](https://oss.javaguide.cn/github/javaguide/cs-basics/data-structure/%E4%BA%8C%E5%8F%89%E6%A0%91-2.png)
1919

2020
如上图所示,通过上面这张图说明一下树中的常用概念:
2121

docs/database/sql/sql-questions-02.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ CREATE TABLE IF NOT EXISTS user_info_vip(
311311
uid INT(11) UNIQUE NOT NULL COMMENT '用户ID',
312312
nick_name VARCHAR(64) COMMENT'昵称',
313313
achievement INT(11) DEFAULT 0 COMMENT '成就值',
314-
level INT(11) COMMENT '用户等级',
314+
`level` INT(11) COMMENT '用户等级',
315315
job VARCHAR(32) COMMENT '职业方向',
316316
register_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间'
317317
)CHARACTER SET UTF8

docs/distributed-system/rpc/rpc-intro.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ tag:
3131

3232
具体原理图如下,后面我会串起来将整个 RPC 的过程给大家说一下。
3333

34-
![RPC原理图](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-12-6/37345851.jpg)
34+
![RPC原理图](https://oss.javaguide.cn/github/javaguide/distributed-system/rpc/37345851.jpg)
3535

3636
1. 服务消费端(client)以本地调用的方式调用远程服务;
3737
1. 客户端 Stub(client stub) 接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体(序列化):`RpcRequest`
@@ -82,7 +82,7 @@ Motan 是新浪微博开源的一款 RPC 框架,据说在新浪微博正支撑
8282

8383
### gRPC
8484

85-
![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2020-8/2843b10d-0c2f-4b7e-9c3e-ea4466792a8b.png)
85+
![](https://oss.javaguide.cn/github/javaguide/distributed-system/rpc/2843b10d-0c2f-4b7e-9c3e-ea4466792a8b.png)
8686

8787
gRPC 是 Google 开源的一个高性能、通用的开源 RPC 框架。其由主要面向移动应用开发并基于 HTTP/2 协议标准而设计(支持双向流、消息头压缩等功能,更加节省带宽),基于 ProtoBuf 序列化协议开发,并且支持众多开发语言。
8888

@@ -114,11 +114,11 @@ Dubbo 不论是从功能完善程度、生态系统还是社区活跃度来说
114114

115115
下图展示了 Dubbo 的生态系统。
116116

117-
![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2020-8/eee98ff2-8e06-4628-a42b-d30ffcd2831e.png)
117+
![](https://oss.javaguide.cn/github/javaguide/distributed-system/rpc/eee98ff2-8e06-4628-a42b-d30ffcd2831e.png)
118118

119119
Dubbo 也是 Spring Cloud Alibaba 里面的一个组件。
120120

121-
![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2020-8/0d195dae-72bc-4956-8451-3eaf6dd11cbd.png)
121+
![](https://oss.javaguide.cn/github/javaguide/distributed-system/rpc/0d195dae-72bc-4956-8451-3eaf6dd11cbd.png)
122122

123123
但是,Dubbo 和 Motan 主要是给 Java 语言使用。虽然,Dubbo 和 Motan 目前也能兼容部分语言,但是不太推荐。如果需要跨多种语言调用的话,可以考虑使用 gRPC。
124124

docs/high-performance/message-queue/kafka-questions-01.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ Kafka 主要有两大应用场景:
3939
4040
#### 队列模型:早期的消息模型
4141

42-
![队列模型](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/队列模型23.png)
42+
![队列模型](https://oss.javaguide.cn/github/javaguide/high-performance/message-queue/%E9%98%9F%E5%88%97%E6%A8%A1%E5%9E%8B23.png)
4343

4444
**使用队列(Queue)作为消息通信载体,满足生产者与消费者模式,一条消息只能被一个消费者使用,未被消费的消息在队列中保留直到被消费或超时。** 比如:我们生产者发送 100 条消息的话,两个消费者来消费一般情况下两个消费者会按照消息发送的顺序各自消费一半(也就是你一个我一个的消费。)
4545

@@ -186,7 +186,7 @@ if (sendResult.getRecordMetadata() != null) {
186186

187187
我们知道消息在被追加到 Partition(分区)的时候都会分配一个特定的偏移量(offset)。偏移量(offset)表示 Consumer 当前消费到的 Partition(分区)的所在的位置。Kafka 通过偏移量(offset)可以保证消息在分区内的顺序性。
188188

189-
![kafka offset](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/kafka-offset.jpg)
189+
![kafka offset](https://oss.javaguide.cn/github/javaguide/high-performance/message-queue/kafka-offset.jpg)
190190

191191
当消费者拉取到了分区的某个消息之后,消费者会自动提交了 offset。自动提交的话会有一个问题,试想一下,当消费者刚拿到这个消息准备进行真正消费的时候,突然挂掉了,消息实际上并没有被消费,但是 offset 却被自动提交了。
192192

docs/high-performance/message-queue/message-queue.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ tag:
6969

7070
使用消息队列还可以降低系统耦合性。我们知道如果模块之间不存在直接调用,那么新增模块或者修改模块就对其他模块影响较小,这样系统的可扩展性无疑更好一些。还是直接上图吧:
7171

72-
![解耦](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/消息队列-解耦.png)
72+
![解耦](https://oss.javaguide.cn/github/javaguide/high-performance/message-queue/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97-%E8%A7%A3%E8%80%A6.png)
7373

7474
生产者(客户端)发送消息到消息队列中去,接受者(服务端)处理消息,需要消费的系统直接去消息队列取消息进行消费即可而不需要和其他系统有耦合,这显然也提高了系统的扩展性。
7575

docs/java/collection/java-collection-questions-02.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -484,13 +484,19 @@ Java 8 中,锁粒度更细,`synchronized` 只锁定当前链表或红黑二
484484
public static final Object NULL = new Object();
485485
```
486486

487+
最后,再分享一下 `ConcurrentHashMap` 作者本人 (Doug Lea)对于这个问题的回答:
488+
489+
> The main reason that nulls aren't allowed in ConcurrentMaps (ConcurrentHashMaps, ConcurrentSkipListMaps) is that ambiguities that may be just barely tolerable in non-concurrent maps can't be accommodated. The main one is that if `map.get(key)` returns `null`, you can't detect whether the key explicitly maps to `null` vs the key isn't mapped. In a non-concurrent map, you can check this via `map.contains(key)`, but in a concurrent one, the map might have changed between calls.
490+
491+
翻译过来之后的,大致意思还是单线程下可以容忍歧义,而多线程下无法容忍。
492+
487493
### ConcurrentHashMap 能保证复合操作的原子性吗?
488494

489-
`ConcurrentHashMap` 是线程安全的,意味着它可以保证多个线程同时对它进行读写操作时,不会出现数据不一致的情况。但是,这并不意味着它可以保证所有的复合操作都是原子性的
495+
`ConcurrentHashMap` 是线程安全的,意味着它可以保证多个线程同时对它进行读写操作时,不会出现数据不一致的情况,也不会导致 JDK1.7 及之前版本的 `HashMap` 多线程操作导致死循环问题。但是,这并不意味着它可以保证所有的复合操作都是原子性的,一定不要搞混了!
490496

491497
复合操作是指由多个基本操作(如`put`、`get`、`remove`、`containsKey`等)组成的操作,例如先判断某个键是否存在`containsKey(key)`,然后根据结果进行插入或更新`put(key, value)`。这种操作在执行过程中可能会被其他线程打断,导致结果不符合预期。
492498

493-
假设有两个线程 AB 同时对 `ConcurrentHashMap` 进行复合操作,如下:
499+
例如,有两个线程 AB 同时对 `ConcurrentHashMap` 进行复合操作,如下:
494500

495501
```java
496502
// 线程 A
@@ -534,7 +540,7 @@ map.computeIfAbsent(key, k -> value);
534540
map.computeIfAbsent(key, k -> anotherValue);
535541
```
536542

537-
不建议使用加锁的同步机制,违背了使用 `ConcurrentHashMap` 的初衷。
543+
很多同学可能会说了,这种情况也能加锁同步呀!确实可以,但不建议使用加锁的同步机制,违背了使用 `ConcurrentHashMap` 的初衷。在使用 `ConcurrentHashMap` 的时候,尽量使用这些原子性的复合操作方法来保证原子性
538544

539545
## Collections 工具类(不重要)
540546

0 commit comments

Comments
 (0)