美團Java研發崗二面:什麼叫線程安全?servlet是線程安全嗎?

前言:

再過一個月的時間就是金三銀四了,相信很多的朋友對於已經作好了充足的準備來應對這一次春招,小編對你們也沒有太多的建議和幫助,分享一些大家面試上面能夠用獲得的一些面試題。今天主要給你們分享多線程(線程安全)方面的面試題,看到文章的小夥伴必定要看到後面哦,有海量的面試題分享給你們喲。java

一、什麼叫線程安全?servlet是線程安全嗎?

線程安全 就是多線程在運行期間不會產生不符合常規的數據。程序員

一樣在多線程訪問同一代碼,不會產生不肯定的結果面試

線程安全首先呢他的是多線程,至少是2個。由於一個線程那確定是線程安全的。就你本身一個線程執行沒有人給你爭用資源。你是在串行執行,不會出現不肯定結果。 若是有多個線程 那問題可就多了。好比一個 ArrayList 類,在添加一個元素的時候,它可能會有兩步來完成:spring

1. 在 Items[Size] 的位置存放此元素;安全

2. 增大 Size 的值。微信

線程A完成第一步時,被CPU暫停了。此時Size值仍是原來的值線程B並不知情,又跑到線程A剛纔放元素的位置又放了一遍,而後Size+1。緊接着A也被喚醒了,也去Size+1 這時候Size = 2了,可是隻有一個元素。雖然放了兩次放到了一樣的位置上覆蓋了。多線程

怎麼解決這個問題?能夠好好思考一下併發

一、把操做設置成原子操做,哥執行的時候不被別人打擾。函數

二、讓修改過的值實時告知給其餘線程。微服務

三、還有我繼續想~

Servlet是線程不安全的

二、同步有幾種實現方法?

同步有兩種方法 分別是synchronized wait與notify

三、請說明下java的內存模型及其工做流程。

Java內存模型就是 java內存分爲主內存和工做內存

多線程 每個線程都會有一個本身的工做內存,所使用到的變量都是主內存的一份拷貝。

四、volatile有什麼用?可否用一句話說明下volatile的應用場景?

Volatile 的做用就是多線程使用同一個變量時,每次都去主內存去讀。保障了數據的實時性。 應用場景就是多線程 操做同一個變量。

五、多線程執行怎麼保障變量的可見性?

可見性:就是一個線程修改了變量,其餘線程能夠當即知道

保證可見性的方法

volatile

synchronized (unlock以前,寫變量值回主存)

final(一旦初始化完成,其餘線程就可見)

六、爲何代碼會重排序?

代碼重排序是爲了CPU的高效率執行。

JVM指令重排的基本原則

  • 程序順序原則:一個線程內保證語義的串行性
  • volatile規則:volatile變量的寫,先發生於讀
  • 鎖規則:解鎖(unlock)必然發生在隨後的加鎖(lock)前
  • 傳遞性:A先於B,B先於C 那麼A必然先於C
  • 線程的start方法先於它的每個動做
  • 線程的全部操做先於線程的終結(Thread.join())
  • 線程的中斷(interrupt())先於被中斷線程的代碼
  • 對象的構造函數執行結束先於finalize()方法

關於JAVA 多線程併發知識點總結(思惟導圖)


推薦閱讀:

更多技術文章和麪試真題能夠關注微信公衆號:Java程序員彙集地。

相關文章
相關標籤/搜索