1. 程式人生 > >Java面試題-線程安全

Java面試題-線程安全

通過 釋放 運行時 ica work 面試題 條件 同時 strong

1. 什麽叫線程安全?servlet是線程安全嗎?
答:如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量 的值也和預期的是一樣的,就是線程安全的。 或者說:一個類或者程序所提供的接口對於線程來說是原子操作或者多個線程之間的切換不會導致該接口的執行結果 存在二義性,也就是說我們不用考慮同步的問題。
servlet不是線程安全的,每個servlet都只被實例化一次,每個調用都是servlet的同一個實例,並且對類變量沒有線程安全,數據量大的時候容易照成異常。

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


答:同步的實現方面有兩種,分別是synchronized,wait與notify

3. volatile有什麽用?能否用一句話說明下volatile的應用場景?

答:Volatile 變量具有 synchronized 的可見性特性,但是不具備原子特性。可以被看作是一種 “程度較輕的 synchronized”;與 synchronized 塊相比,volatile 變量所需的編碼較少,並且運行時開銷也較少,但是它所能實現的功能也僅是 synchronized 的一部分。
您只能在有限的一些情形下使用 volatile 變量替代鎖。要使 volatile 變量提供理想的線程安全,必須同時滿足下面兩個條件:

A. 對變量的寫操作不依賴於當前值。
B. 該變量沒有包含在具有其他變量的不變式中。

4. 請說明下java的內存模型及其工作流程。
答:Java把內存劃分成兩種:一種是棧內存,一種是堆內存。
棧內存:存放對象:函數中基本類型的變量和對象的引用變量、靜態類方法 ;特點:棧有一個很重要的特殊性,就是存在棧中的數據可以共享。
堆內存:存放對象:用來存放由new創建的對象和數組;特點:在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。
java 內存模型 ( java memory model ):根據Java Language Specification中的說明, jvm系統中存在一個主內存(Main Memory或Java Heap Memory),Java中所有對象成員變量都儲存在主存中,對於所有線程都是共享的。每條線程都有自己的工作內存(Working Memory),工作內存中保存的是主存中某些對象成員變量的拷貝,線程對所有對象成員變量的操作都是在工作內存中進行,線程之間無法相互直接訪問,變量 傳遞均需要通過主存完成。

(1) 獲取對象監視器的鎖(lock)
(2) 清空工作內存數據, 從主存復制對象成員變量到當前工作內存, 即同步數據 (read and load)
(3) 執行代碼,改變共享變量值 (use and assign)
(4) 將工作內存數據刷回主存 (store and write)
(5) 釋放對象監視器的鎖 (unlock)

Java面試題-線程安全