线程安全面试题 java_Java面试题-线程安全
1. 什么叫線程安全?servlet是線程安全嗎?
答:如果你的代碼所在的進(jìn)程中有多個(gè)線程在同時(shí)運(yùn)行,而這些線程可能會同時(shí)運(yùn)行這段代碼。如果每次運(yùn)行結(jié)果和單線程運(yùn)行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的,就是線程安全的。?或者說:一個(gè)類或者程序所提供的接口對于線程來說是原子操作或者多個(gè)線程之間的切換不會導(dǎo)致該接口的執(zhí)行結(jié)果存在二義性,也就是說我們不用考慮同步的問題。
servlet不是線程安全的,每個(gè)servlet都只被實(shí)例化一次,每個(gè)調(diào)用都是servlet的同一個(gè)實(shí)例,并且對類變量沒有線程安全,數(shù)據(jù)量大的時(shí)候容易照成異常。
2. 同步有幾種實(shí)現(xiàn)方法?
答:同步的實(shí)現(xiàn)方面有兩種,分別是synchronized,wait與notify
3. volatile有什么用?能否用一句話說明下volatile的應(yīng)用場景?
答:Volatile 變量具有 synchronized 的可見性特性,但是不具備原子特性。可以被看作是一種 “程度較輕的 synchronized”;與 synchronized 塊相比,volatile 變量所需的編碼較少,并且運(yùn)行時(shí)開銷也較少,但是它所能實(shí)現(xiàn)的功能也僅是 synchronized 的一部分。
您只能在有限的一些情形下使用 volatile 變量替代鎖。要使 volatile 變量提供理想的線程安全,必須同時(shí)滿足下面兩個(gè)條件:
A. 對變量的寫操作不依賴于當(dāng)前值。
B. 該變量沒有包含在具有其他變量的不變式中。
4. 請說明下java的內(nèi)存模型及其工作流程。
答:Java把內(nèi)存劃分成兩種:一種是棧內(nèi)存,一種是堆內(nèi)存。
棧內(nèi)存:存放對象:函數(shù)中基本類型的變量和對象的引用變量、靜態(tài)類方法 ;特點(diǎn):棧有一個(gè)很重要的特殊性,就是存在棧中的數(shù)據(jù)可以共享。
堆內(nèi)存:存放對象:用來存放由new創(chuàng)建的對象和數(shù)組;特點(diǎn):在堆中分配的內(nèi)存,由Java虛擬機(jī)的自動(dòng)垃圾回收器來管理。
java 內(nèi)存模型 ( java memory model ):根據(jù)Java Language Specification中的說明, jvm系統(tǒng)中存在一個(gè)主內(nèi)存(Main Memory或Java Heap Memory),Java中所有對象成員變量都儲存在主存中,對于所有線程都是共享的。每條線程都有自己的工作內(nèi)存(Working Memory),工作內(nèi)存中保存的是主存中某些對象成員變量的拷貝,線程對所有對象成員變量的操作都是在工作內(nèi)存中進(jìn)行,線程之間無法相互直接訪問,變量傳遞均需要通過主存完成。
(1) 獲取對象監(jiān)視器的鎖(lock)
(2) 清空工作內(nèi)存數(shù)據(jù), 從主存復(fù)制對象成員變量到當(dāng)前工作內(nèi)存, 即同步數(shù)據(jù) (read and load)
(3) 執(zhí)行代碼,改變共享變量值 (use and assign)
(4) 將工作內(nèi)存數(shù)據(jù)刷回主存 (store and write)
(5) 釋放對象監(jiān)視器的鎖 (unlock)
5. 為什么代碼會重排序?
總結(jié)
以上是生活随笔為你收集整理的线程安全面试题 java_Java面试题-线程安全的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java udp 同一个端口_java
- 下一篇: 丰田车系总线系统中,什么属于CAN线网络