關於ThreadLocal的一道面試題
阿新 • • 發佈:2020-07-20
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 staticvoid 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()的操作,這就會出現空指標了。