<input id="0qass"><u id="0qass"></u></input>
  • <input id="0qass"><u id="0qass"></u></input>
  • <menu id="0qass"><u id="0qass"></u></menu>

    (小奇JAVA面試)每日10道Java面試題打卡—Java基礎篇3

    file

    二十一、說說你對線程安全的理解

    與其說是線程安全,不如說是內存安全,堆是共享內存,可以被所有線程訪問。

    是進程和線程共有的空間,每一個進程里面有多個線程,分全局堆和局部堆,全局堆就是所有沒有分配的空間,局部堆就是分配給用戶的空間,堆在操作系統對進程初始化的時候分配,運行過程中也可以向系統要額外的堆,但是用完了還要還給操作系統,要不然就是內存泄漏。

    是每個線程獨有的,所以棧是線程安全的,每個線程的?;ハ嗒毩?。

    目前主流的操作系統都是多任務的,即多個進程同事運行,為了保證安全,每個進程只能訪問分配給自己的內存空間,而不能訪問別的進程的,這是由操作系統保障的。

    在每個進程的內存空間中都會有一塊特殊的公共區域,通常稱為堆(內存),進程內的所有線程都可以訪問這個區域,所以這個區域是線程不安全的。

    二十二、Thread和Runable的區別

    Thread和Runnable的實質是繼承關系,沒有可比性,無論使用Runnable還是Thread,都會new Thread,然后執行run()方法,用法上,如果有復雜的線程操作需求,那就選擇繼承Thread,如果只是簡單的執行一個任務,那就實現runnable。

    二十三、說說你對守護線程的理解

    守護線程:為所有非守護線程提供服務的線程,任何一個守護線程都是在整個JVM中所有非守護線程的保姆。

    守護線程類似于整個進程的一個小兵,它的生死無關重要,但是它卻依賴整個進行而運行,如果其他線程結束了,沒有要執行的了,程序就結束了,守護線程立馬就中斷了。

    注意:由于守護線程的終止是自身無法控制的,因此不要把IO、File等重要操作邏輯分配給它,因為它不靠譜。

    二十四、ThreadLocal的原理的使用場景

    每一個Thread對象均含有一個ThreadLocalMap類型的成員變量threadLocal,它存儲本線程中所有ThreadLocal對象及其對應的值。

    當執行set方法時,ThreadLocal首先會獲取當前線程對象,然后獲取當前線程的ThreadLocalMap對象,再以當前ThreadLocal對象為key,將值存儲進ThreadLocalMap對象中。

    get方法執行過程類似,ThreadLocal首先會獲取當前線程對象,然后獲取當前線程的ThreadLocalMap對象,再以當前ThreadLocal對象為key,獲取對應的value。

    使用場景:

    1、在進行對象跨層傳遞的時候,使用ThreadLocal可以避免多次傳遞,打破層次間的約束。

    2、線程間數據隔離。

    3、進行實物操作,用于存儲線程事務信息。

    4、數據庫連接,Session會話管理。

    二十五、ThreadLocal內存泄漏原因,如何避免

    內存泄漏為程序在申請內存后,無法釋放已申請的內存空間,一次內存泄漏危害可以忽略,但內存泄漏堆積后果很嚴重。

    不再會被使用的對象或者變量占用的內存不能被回收,就是內存泄漏。

    強引用:使用最普通的引用 new,一個對象具有強引用,不會被垃圾回收器回收,當內存空間不足,java虛擬機寧愿拋出outOfMemoryError錯誤,使程序異常終止,也不回收這種對象。

    如果想取消強引用和某個對象之間的關聯,可以顯式地將引用復制為null,這樣可以使JVM在合適的時間就會回收該對象。

    弱引用:jvm進行垃圾回收時,無論內存是否充足,都會回收被弱引用關聯的對象,在java中,用java.lang.ref.WeakReference類來表示,可以在緩存中使用弱引用。

    ThreadLocal的實現原理,每一個Thread維護了一個ThreadLocalMap,key為使用弱引用的ThreadLocal實例,value為線程變量的副本。

    ThreadLocal正確的使用方法:

    每次使用完ThreadLocal都調用它的remove()方法清除數據。

    二十六、并發、并行、串行的區別

    串行在時間上不可能發生重疊,前一個任務沒搞定,下一個任務就只能等著。

    并行在時間上是重疊的,兩個任務在同一時刻互不干擾的同時執行。

    并發允許兩個任務彼此干擾,統一時間點,只有一個任務運行,交替執行。

    二十七、并發的三大特性

    1、原子性

    原子性是指在一個操作中cpu不可以在中途暫停然后再調度,即不被中斷操作,要不全部執行完成,要不都不執行,就好比轉賬,從賬戶A向賬戶B轉1000元,那么必然包括2個操作:從賬戶A減去1000元,往賬戶B加上1000元。2個操作必須全部完成。

    2、可見性

    當多個線程訪問同一個變量時,一個線程修改了這個變量的值,其他線程可以立刻看到這個新變化的值。

    3、有序性

    虛擬機在進行代碼編譯時,對于那些改變順序之后不會對最終結果造成影響的代碼,虛擬機不一定會按照我們寫的代碼順序來執行,有可能將他們重排序,實際上,對于有些代碼進行重排序之后,雖然對變量的值沒有造成影響,但有可能會出現線程安全問題。

    二十八、為什么要用線程池?解釋下線程池參數

    1、降低資源消耗:提高線程利用率,降低創建和銷毀線程的消耗。

    2、提高響應速度:任務來了,直接有現成可用可執行,而不是先創建線程,再執行。

    3、提高線程的可管理性:線程是稀缺資源,使用線程池可以統一分配調優監控。

    1》 corePoolSize代表核心線程數,也就是正常情況下創建工作的線程數,這些線程創建后并不會消除,而是一種常駐線程。

    2》maxinumPoolSize代表最大線程數,它與核心線程數相對應,表示最大允許被創建的線程數,比如當前任務比較多,將核心線程數都用完了,還無法滿足需求時,此時就會創建新的線程,但是線程池內線程總數不會超過最大線程數。

    3》keepAliveTime、unit表示超出核心線程數之外的線程的空閑存活時間,也就是核心線程不會消除,但是超過核心線程數的部分線程如果空閑一定的時間則會被消除,我們可以通過setkeepAliveTime來設置空閑時間。

    4》workQueue用來存放待執行的任務,假設我們現在核心線程都已被使用,還有任務進來則全部放入隊列,直到整個隊列被放滿但任務還在持續進入則會開始創建新的線程。

    5》ThreadFactory實際上是一個線程工廠,用來生產線程執行任務。

    6》Handler:任務拒絕策略,當達到最大線程數,線程池已經沒有能力繼續處理新提交的任務時,就執行任務拒絕策略。

    二十九、簡述線程池處理流程

    file

    三十、線程池中阻塞隊列的作用?為什么是先添加隊列而不是先創建最大線程

    1、一般的隊列只能保證作為一個有限長度的緩沖區,如果超出了緩沖長度,就無法保留當前的任務了,阻塞隊列通過阻塞可以保留住當前想要繼續入隊的任務。

    2、阻塞隊列可以保證任務隊列中沒有任務時阻塞獲取任務的線程,使得線程進入wait狀態,釋放cpu資源。

    3、阻塞隊列自帶阻塞和喚醒的功能,不需要額外處理,無任務執行時,線程池利用阻塞隊列的take方法掛起,從而維持核心線程的存活,不至于一直占用cpu的資源。

    4、在創建新線程的時候,要獲取全局鎖的,這個時候其它的就得阻塞,影響了整體效率,所以說線程的創建是比較消耗資源的。

    • 17
      點贊
    • 36
      評論
    • 21
      收藏
    • 一鍵三連
      一鍵三連
    • 掃一掃,分享海報

    ??2020 CSDN 皮膚主題: 1024 設計師:白松林 返回首頁
    實付
    使用余額支付
    點擊重新獲取
    掃碼支付
    錢包余額 0

    抵扣說明:

    1.余額是錢包充值的虛擬貨幣,按照1:1的比例進行支付金額的抵扣。
    2.余額無法直接購買下載,可以購買VIP、C幣套餐、付費專欄及課程。

    余額充值
    多乐彩