Skip to content

Commit af370ce

Browse files
committed
Update b-3Java多线程.md
1 parent 7c6193a commit af370ce

File tree

1 file changed

+3
-5
lines changed

1 file changed

+3
-5
lines changed

docs/b-3Java多线程.md

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -472,9 +472,7 @@ public class SynchronizedDemo2 {
472472

473473
**如果你创建了一个`ThreadLocal`变量,那么访问这个变量的每个线程都会有这个变量的本地副本,这也是`ThreadLocal`变量名的由来。他们可以使用 `get()``set()` 方法来获取默认值或将其值更改为当前线程所存的副本的值,从而避免了线程安全问题。**
474474

475-
再举个简单的例子:
476-
477-
比如有两个人去宝屋收集宝物,这两个共用一个袋子的话肯定会产生争执,但是给他们两个人每个人分配一个袋子的话就不会出现这样的问题。如果把这两个人比作线程的话,那么 ThreadLocal 就是用来避免这两个线程竞争的。
475+
再举个简单的例子:比如有两个人去宝屋收集宝物,这两个共用一个袋子的话肯定会产生争执,但是给他们两个人每个人分配一个袋子的话就不会出现这样的问题。如果把这两个人比作线程的话,那么 ThreadLocal 就是用来避免这两个线程竞争的。
478476

479477
### 2.3.19. ThreadLocal 原理讲一下
480478

@@ -512,7 +510,7 @@ ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
512510

513511
通过上面这些内容,我们足以通过猜测得出结论:**最终的变量是放在了当前线程的 `ThreadLocalMap` 中,并不是存在 `ThreadLocal` 上,`ThreadLocal` 可以理解为只是`ThreadLocalMap`的封装,传递了变量值。** `ThrealLocal` 类中可以通过`Thread.currentThread()`获取到当前线程对象后,直接通过`getMap(Thread t)`可以访问到该线程的`ThreadLocalMap`对象。
514512

515-
**`ThreadLocal` 内部维护的是一个类似 `Map``ThreadLocalMap` 数据结构,`key` 为当前对象的 `Thread` 对象,值为 Object 对象**
513+
**每个`Thread`中都具备一个`ThreadLocalMap`,而`ThreadLocalMap`可以存储以`ThreadLocal`为 key ,Object 对象为 value 的键值对**
516514

517515
```java
518516
ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
@@ -522,7 +520,7 @@ ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
522520

523521
比如我们在同一个线程中声明了两个 `ThreadLocal` 对象的话,会使用 `Thread`内部都是使用仅有那个`ThreadLocalMap` 存放数据的,`ThreadLocalMap`的 key 就是 `ThreadLocal`对象,value 就是 `ThreadLocal` 对象调用`set`方法设置的值。
524522

525-
![ThreadLocal数据结构](https://upload-images.jianshu.io/upload_images/7432604-ad2ff581127ba8cc.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/806)
523+
![ThreadLocal数据结构](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020/1/806.jpeg)
526524

527525
`ThreadLocalMap``ThreadLocal`的静态内部类。
528526

0 commit comments

Comments
 (0)