ThreadLocal相關面試

1.ThreadLocal是什麼?

1.其實ThreadLocal跟Synchronized一樣,都是一個爲了解決變量變化問題,類似給變量加鎖;
2.實際上使用了ThreadLocal,相當於對對本地線程中的變量或者變量對象的引用copy一份,這樣就使得各個線程中
  的變量和對象互不影響;這樣各個線程在高併發場景下,適合各個線程不共享變量值的操作;
3.ThreadLocal是無狀態的,所謂的無狀態主要是指的ThreadLocal中的變量都是相互隔離的,
  線程間變量變化是不影響其他線程中的變量值得

2.ThreadLocal的工作原理?

1.ThreadLocal中使用ThreadLocalMap去存儲變量相關的數據
  其中ThreadLocal本身對象this作爲key,value爲變量的副本;
2.get()方法用於獲取當前線程的副本變量值。
  set()方法用於保存當前線程的副本變量值。
  initialValue()爲當前線程初始副本變量值。
  remove()方法移除當前線程的副本變量值。  

3.如何解決ThreadLocal的內存泄漏問題

4.案例

package com.gaoxinfu.demo.jdk.rt.java.lang.thread;

/**
 * @Description:
 * @Author: gaoxinfu
 * @Date: 2020-05-19 17:04
 */
public class ThreadLocalDemo {

    private static ThreadLocal<String> nameThreadLocal=new ThreadLocal<String>(){
        @Override
        protected String initialValue() {
            return "gaoxinfu";
        }
    };

    public static void main(String[] args) {
        for (int i=0;i<5;i++){
            new Thread(()->{
                System.out.println("Thread Name = "+Thread.currentThread().getName()+",Name = "+nameThreadLocal.get());
            },"thread"+i).start();
        }

    }
}

com.gaoxinfu.demo.jdk.rt.java.lang.thread.ThreadLocalDemo
Thread Name = thread0,Name = gaoxinfu
Thread Name = thread1,Name = gaoxinfu
Thread Name = thread2,Name = gaoxinfu
Thread Name = thread3,Name = gaoxinfu
Thread Name = thread4,Name = gaoxinfu
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章