1. 程式人生 > 實用技巧 >關於ThreadLocal的一道面試題

關於ThreadLocal的一道面試題

 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()的操作,這就會出現空指標了。