再過一個月的時間就是金三銀四了,相信很多的朋友對於已經作好了充足的準備來應對這一次春招,小編對你們也沒有太多的建議和幫助,分享一些大家面試上面能夠用獲得的一些面試題。今天主要給你們分享多線程(線程安全)方面的面試題,看到文章的小夥伴必定要看到後面哦,有海量的面試題分享給你們喲。java
線程安全 就是多線程在運行期間不會產生不符合常規的數據。程序員
一樣在多線程訪問同一代碼,不會產生不肯定的結果面試
線程安全首先呢他的是多線程,至少是2個。由於一個線程那確定是線程安全的。就你本身一個線程執行沒有人給你爭用資源。你是在串行執行,不會出現不肯定結果。 若是有多個線程 那問題可就多了。好比一個 ArrayList 類,在添加一個元素的時候,它可能會有兩步來完成:spring
1. 在 Items[Size] 的位置存放此元素;安全
2. 增大 Size 的值。微信
線程A完成第一步時,被CPU暫停了。此時Size值仍是原來的值線程B並不知情,又跑到線程A剛纔放元素的位置又放了一遍,而後Size+1。緊接着A也被喚醒了,也去Size+1 這時候Size = 2了,可是隻有一個元素。雖然放了兩次放到了一樣的位置上覆蓋了。多線程
怎麼解決這個問題?能夠好好思考一下併發
一、把操做設置成原子操做,哥執行的時候不被別人打擾。函數
二、讓修改過的值實時告知給其餘線程。微服務
三、還有我繼續想~
同步有兩種方法 分別是synchronized wait與notify
Java內存模型就是 java內存分爲主內存和工做內存。
多線程 每個線程都會有一個本身的工做內存,所使用到的變量都是主內存的一份拷貝。
Volatile 的做用就是多線程使用同一個變量時,每次都去主內存去讀。保障了數據的實時性。 應用場景就是多線程 操做同一個變量。
可見性:就是一個線程修改了變量,其餘線程能夠當即知道
保證可見性的方法
volatile
synchronized (unlock以前,寫變量值回主存)
final(一旦初始化完成,其餘線程就可見)
代碼重排序是爲了CPU的高效率執行。
JVM指令重排的基本原則
更多技術文章和麪試真題能夠關注微信公衆號:Java程序員彙集地。