標籤:wait sign spec 存在 相互 代碼 記憶體回收 問題 應用
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面試題-安全執行緒