Java面試題——隨機題(一),看看哪些你會哪些你不會

Java面試題——隨機題(一),看看哪些你會哪些你不會

博客說明面試

文章所涉及的資料來自互聯網整理和我的總結,意在於我的學習和經驗彙總,若有什麼地方侵權,請聯繫本人刪除,謝謝!

請說明一下EJB的幾種類型分別是什麼?

會話(Session)Bean、實體(Entity)Bean 、消息驅動的(Message Driven)Beanredis

會話Bean又可分爲有狀態(Stateful)和無狀態(Stateless)兩種數據庫

實體Bean可分爲Bean管理的持續性(BMP)和容器管理的持續性(CMP)兩種。安全

請說明一下鎖機制的做用是什麼?而且簡述一下Hibernate的悲觀鎖和樂觀鎖機制是什麼?

鎖機制的做用是保證共享資源能夠進行排他性的訪問網絡

悲觀鎖悲觀的認爲在數據處理過程當中極有可能存在修改數據的併發事務(包括本系統的其餘事務或來自外部系統的事務),因而將處理的數據設置爲鎖定狀態。多線程

數據庫中主要是經過數據庫底層的鎖機制才能保證真正的數據訪問排他性。併發

缺點:併發量不高,效率低;less

樂觀鎖對併發事務持樂觀態度(認爲對數據的併發操做不會常常性的發生),經過更加寬鬆的鎖機制來解決因爲悲觀鎖排他性的數據訪問對系統性能形成的嚴重影響。最多見的樂觀鎖是經過數據版本標識來實現的異步

redis爲何是單線程?

多線程不必定比單線程效率高,多線程的本質就是CPU經過輪換時間片執行不一樣的線程,看似多個線程一塊兒執行,可是卻承擔線程上下文切換的代價。函數

而對於Redis這樣的內存數據庫來講,沒有上下文的切換的單線程效率是最高的。Redis用單個CPU綁定一塊內存的數據,而後針對這塊內存的數據進行屢次讀寫操做都是在一個CPU上完成的。

請你談談Java中線程如何實現,以及如何實現多線程,線程安全在Java中是如何實現的,線程的工做區是哪裏

Java多線程有三種實現方式

(1)繼承Thread類,重寫run函數

(2)實現Runnable接口,重寫run函數

開啓線程:Thread t = new Thread(對象) //建立線程對象

t.start()

(3)實現Callable接口,重寫call函數

Callable是相似於Runnable的接口,實現Callable接口的類和實現Runnable的類都是可被其它線程執行的任務。

Callable和Runnable有幾點不一樣:

①Callable規定的方法是call(),而Runnable規定的方法是run()

②Callable的任務執行後可返回值,而Runnable的任務是不能返回值的

③call()方法可拋出異常,而run()方法是不能拋出異常的。

④運行Callable任務可拿到一個Future對象,Future表示異步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,並檢索計算的結果.經過Future對象可瞭解任務執行狀況,可取消任務的執行,還可獲取任務執行的結果

線程不安全的緣由:

在操做系統中,線程是不擁有資源的,進程是擁有資源的。而線程是由進程建立的,一個進程能夠建立多個線程,這些線程共享着進程中的資源。因此,當線程一塊兒併發運行時,同時對一個數據進行修改,就可能會形成數據的不一致性

線程安全的解決機制:
  1. 加鎖。

    • 鎖能使其保護的代碼以串行的形式來訪問,當給一個複合操做加鎖後,能使其成爲原子操做。一種錯誤的思想是隻要對寫數據的方法加鎖,其實這是錯的,對數據進行操做的全部方法都需加鎖,不論是讀仍是寫。
    • 加鎖時須要考慮性能問題,不能老是一味地給整個方法加鎖synchronized就了事了,應該將方法中不影響共享狀態且執行時間比較長的代碼分離出去。
    • 加鎖的含義不只僅侷限於互斥,還包括可見性。爲了確保全部線程都能看見最新值,讀操做和寫操做必須使用一樣的鎖對象。
  2. 不共享狀態

    • 無狀態對象: 無狀態對象必定是線程安全的,由於不會影響到其餘線程。
    • 線程關閉: 僅在單線程環境下使用。
  3. 不可變對象

    可使用final修飾的對象保證線程安全,因爲final修飾的引用型變量(除String外)不可變是指引用不可變,但其指向的對象是可變的,因此此類必須安全發佈,也即不能對外提供能夠修改final對象的接口。

線程的工做區

Java內存模型分爲主內存,和工做內存。主內存是全部的線程所共享的,工做內存是每一個線程本身有一個,不是共享的。

每條線程還有本身的工做內存,線程的工做內存中保存了被該線程使用到的變量的主內存副本拷貝。線程對變量的全部操做(讀取、賦值),都必須在工做內存中進行,而不能直接讀寫主內存中的變量。不一樣線程之間也沒法直接訪問對方工做內存中的變量,線程間變量值的傳遞均須要經過主內存來完成

感謝

牛客網

萬能的網絡

以及勤勞的本身

相關文章
相關標籤/搜索