posts - 46,  comments - 9,  views - 13万
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
复制代码
 1 public class TestThreadLocalNpe {
 2     private static ThreadLocal<Long> threadLocal = new ThreadLocal();
 3 
 4     public static void set() {
 5         threadLocal.set(1L);
 6     }
 7 
 8     public static long get() {
 9         return threadLocal.get();
10     }
11 
12     public static void main(String[] args) throws InterruptedException {
13         new Thread(() -> {
14             set();
15             System.out.println(get());
16         }).start();
17         // 目的就是为了让子线程先运行完
18         Thread.sleep(100);
19         System.out.println(get());
20     }
21 }
复制代码

问:上面这段代码会输出什么?为什么?

答:

1
Exception in thread "main" java.lang.NullPointerException
 at com.chentongwei.study.thread.TestThreadLocalNpe.get(TestThreadLocalNpe.java:16)
 at com.chentongwei.study.thread.TestThreadLocalNpe.main(TestThreadLocalNpe.java:26)

为什么输出1然后空指针了?

输出1是没有任何问题的。那空指针是为什么呢?

因为这是两个线程,子线程和主线程。子线程设置1,主线程肯定拿不到啊。ThreadLocal是和线程息息相关的。

再说说为什么会空指针?

因为你的get方法用的是long而不是Long,get方法在未设置初始化值的时候,默认返回的书null。long是基本类型,而ThreadLocal里的泛型是Long,get却是基本类型,所以要进行拆箱操作,也就是进行

null.longValue()的操作,这就会出现空指针了。

 

posted on   十七年蝉  阅读(471)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
历史上的今天:
2018-07-20 (面试)大型网站应用之海量数据、高并发解决方案
点击右上角即可分享
微信分享提示