Skip to content
Able Blog
Home
Others
  • Home
      • 学习笔记
          • Android
            • 简历_赵思琦_Android_5年经验
                • Handler
                  • 01. handler整体架构方案原理
                    • 02. Message源码分析
                      • 03. Looper源码分析
                        • 04. ThreadLocal的使用及源码解析文章
                          • 总结
                            • 源码解析
                            • 05. MessageQueue源码解析
                              • 06. Handler源码解析
                                • 07. 源码阅读总结
                                  • 08. Carson Handler总结的机制源码解析
                                    • 09. handler 内存泄漏的原因

                                04. ThreadLocal的使用及源码解析文章

                                author iconAblecalendar icon2022年4月13日category icon
                                • Android
                                tag icon
                                • Handler
                                • 学习笔记
                                word icon约 402 字

                                此页内容
                                • 总结
                                • 源码解析

                                # 04. ThreadLocal的使用及源码解析文章

                                线程内部存储数据的工具类。 线程中存储自己的私有数据

                                ThreadLocal 可以在一个线程中传递同一个对象, 跨方法调用,避免引用传递的麻烦。

                                线程局部变量

                                ThreadLocal实例通常是希望将状态与线程相关联的类中的私有静态字段.

                                fun testThreadLocal() {
                                    val threadLocal = ThreadLocal<String>()
                                    threadLocal.set("主线程")
                                    Thread(Runnable {
                                        threadLocal.set("子线程1")
                                        var i=0;
                                        while (true){
                                            Thread.sleep(1000)
                                            if(threadLocal.get().isNotEmpty()){
                                                println("ThreadLocation子2:"+threadLocal.get().toString())
                                            }else{
                                                println("没有子线程1")
                                            }
                                            Thread.sleep(1000)
                                            threadLocal.set("子线程1"+(i++))
                                
                                        }
                                    }).start()
                                
                                    Thread(Runnable {
                                        threadLocal.set("子线程2")
                                        var i=0;
                                        while (true){
                                            Thread.sleep(1000)
                                            if(threadLocal.get().isNotEmpty()){
                                                println("ThreadLocation子2:"+threadLocal.get().toString())
                                            }else{
                                                println("没有子线程2")
                                            }
                                            Thread.sleep(1000)
                                            threadLocal.set("子线程2"+(i++))
                                
                                        }
                                
                                    }).start()
                                
                                    println("ThreadLocation主:"+threadLocal.get().toString())
                                
                                
                                }
                                
                                fun main() {
                                    testThreadLocal()
                                }
                                
                                1
                                2
                                3
                                4
                                5
                                6
                                7
                                8
                                9
                                10
                                11
                                12
                                13
                                14
                                15
                                16
                                17
                                18
                                19
                                20
                                21
                                22
                                23
                                24
                                25
                                26
                                27
                                28
                                29
                                30
                                31
                                32
                                33
                                34
                                35
                                36
                                37
                                38
                                39
                                40
                                41
                                42
                                43
                                44
                                输出
                                ThreadLocation主:主线程
                                ThreadLocation子2:子线程2
                                ThreadLocation子2:子线程1
                                ThreadLocation子2:子线程10
                                ThreadLocation子2:子线程20
                                ThreadLocation子2:子线程21
                                ThreadLocation子2:子线程11
                                ThreadLocation子2:子线程12
                                ThreadLocation子2:子线程22
                                ThreadLocation子2:子线程13
                                ThreadLocation子2:子线程23
                                ThreadLocation子2:子线程24
                                ThreadLocation子2:子线程14
                                ThreadLocation子2:子线程25
                                ThreadLocation子2:子线程15
                                ...
                                
                                
                                1
                                2
                                3
                                4
                                5
                                6
                                7
                                8
                                9
                                10
                                11
                                12
                                13
                                14
                                15
                                16
                                17
                                18

                                以上我们发现,在不同的线程中ThreadLocal.set并不会改变当前线程的get(),只有所在线程set可以更改。

                                # 总结

                                ThreadLocal将数据绑定在不同的线程中 。适用于不同线程作用域的数据备份。

                                # 源码解析

                                ThreadLocal源码解析open in new window

                                ThreadLocal源码解析open in new window

                                JDK源码open in new window

                                edit icon编辑此页open in new window
                                上次编辑于: 2022/4/17 23:10:35
                                贡献者: zsqan
                                上一页
                                03. Looper源码分析
                                下一页
                                05. MessageQueue源码解析
                                默认页脚
                                Copyright © 2022 Able