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

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

線程安全 就是多線程在運行期間不會產生不符合常規的數據。
同樣在多線程訪問同一代碼,不會產生不確定的結果
線程安全首先呢他的是多線程,至少是2個。因爲一個線程那肯定是線程安全的。就你自己一個線程執行沒有人給你爭用資源。你是在串行執行,不會出現不確定結果。 如果有多個線程 那問題可就多了。比如一個 ArrayList 類,在添加一個元素的時候,它可能會有兩步來完成:
1. 在 Items[Size] 的位置存放此元素;
2. 增大 Size 的值。
線程A完成第一步時,被CPU暫停了。此時Size值還是原來的值線程B並不知情,又跑到線程A剛纔放元素的位置又放了一遍,然後Size+1。緊接着A也被喚醒了,也去Size+1 這時候Size = 2了,但是隻有一個元素。雖然放了兩次放到了同樣的位置上覆蓋了。
怎麼解決這個問題?可以好好思考一下
1、把操作設置成原子操作,哥執行的時候不被別人打擾。
2、讓修改過的值實時告知給其他線程。
3、還有我繼續想~
Servlet是線程不安全的。

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

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

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

Java內存模型就是 java內存分爲主內存和工作內存。
多線程 每一個線程都會有一個自己的工作內存,所使用到的變量都是主內存的一份拷貝。

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

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

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

可見性:就是一個線程修改了變量,其他線程可以立即知道
保證可見性的方法
volatile
synchronized (unlock之前,寫變量值回主存)
final(一旦初始化完成,其他線程就可見)

6、爲什麼代碼會重排序?

代碼重排序是爲了CPU的高效率執行。
JVM指令重排的基本原則
  • 程序順序原則:一個線程內保證語義的串行性
  • volatile規則:volatile變量的寫,先發生於讀
  • 鎖規則:解鎖(unlock)必然發生在隨後的加鎖(lock)前
  • 傳遞性:A先於B,B先於C 那麼A必然先於C
  • 線程的start方法先於它的每一個動作
  • 線程的所有操作先於線程的終結(Thread.join())
  • 線程的中斷(interrupt())先於被中斷線程的代碼
  • 對象的構造函數執行結束先於finalize()方法

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

總結:
Java多線程一直是大廠面試考察的一個重點,上面給大家展示的是一部分學習路線,由於文章的長度限制,沒有將所有的答案都給大家分享出來,除了Java多線程,小編還整理了有微服務,開源框架,
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章