濟南做html5網(wǎng)站建設(shè)發(fā)布信息的免費平臺有哪些
目錄
- 題目
- wait()、notify()和notifyAll()方法的特性和使用場景
- wait() 方法
- notify() 方法
- notifyAll() 方法
- 使用場景
- 注意事項
題目
選自??途W(wǎng)
1.下面關(guān)于JAVA的垃圾回收機制,正確的是( )
A.當(dāng)調(diào)用“System.gc()”來強制回收時,系統(tǒng)會立即回收垃圾
B.垃圾回收不能確定具體的回收時間
C.程序可明確地標(biāo)識某個局部變量的引用不再被使用
D.程序可以顯式地立即釋放對象占有的內(nèi)存
正確答案:B
正確的描述是選項B:“垃圾回收不能確定具體的回收時間”。Java的垃圾回收機制是自動運行的,它負(fù)責(zé)回收不再使用的對象所占用的內(nèi)存。然而,垃圾回收的具體觸發(fā)時間和頻率是不確定的,由垃圾回收器根據(jù)系統(tǒng)的運行狀態(tài)自動決定。即使調(diào)用了System.gc()
方法建議進(jìn)行垃圾回收,也不能保證垃圾回收會立即執(zhí)行,這只是一個建議,垃圾回收器可以選擇忽略。因此,選項B是正確的。選項A和D的描述與Java垃圾回收機制的實際行為不符,而選項C描述的是可以通過將引用設(shè)為null
來暗示對象不再使用,但這并不是強制垃圾回收,垃圾回收器仍然會根據(jù)自己的策略來決定何時回收這些對象。
2.java中Hashtable, Vector, TreeSet, LinkedList哪些線程是安全的?
A.Hashtable
B.Vector
C.TreeSet
D.LinkedList
正確答案:AB
在Java中,
Hashtable
和Vector
是早期設(shè)計的集合類,它們內(nèi)部的方法是同步的,因此它們是線程安全的。這意味著它們可以在多線程環(huán)境中共享而不需要額外的同步措施。然而,TreeSet
和LinkedList
并不提供內(nèi)置的線程安全保障,它們的方法是非同步的,因此在多線程環(huán)境中共享時需要額外的同步控制,或者使用線程安全的包裝類,如Collections.synchronizedSet()
和Collections.synchronizedList()
,來包裝這些集合,以提供線程安全性。因此,正確答案是 A 和 B:
Hashtable
和Vector
是線程安全的集合類。
3.下面哪些寫法能在 java8 中編譯執(zhí)行()
A.dir.listFiles((File f)->f.getName().endsWith(“.Java”));
B.dir.listFiles((File f)=>f.getName().endsWith(“.Java”));
C.dir.listFiles((_.getName().endsWith(“.Java”)));
D.dir.listFiles( f->f.getName().endsWith(“.Java”));
ad
形參列表:
- 形參列表定義了Lambda表達(dá)式接受的參數(shù)。參數(shù)類型可以被省略,Java編譯器會根據(jù)上下文推斷它們的類型。
- 如果Lambda表達(dá)式只有一個參數(shù),那么甚至可以省略圓括號。例如,
(String s) -> s.length()
可以簡化為String s -> s.length()
。箭頭(→):
- 箭頭是Lambda表達(dá)式的固定組成部分,用于分隔形參列表和代碼塊。它表示從參數(shù)到執(zhí)行代碼的轉(zhuǎn)換。
代碼塊:
- 代碼塊包含了Lambda表達(dá)式執(zhí)行的邏輯。如果代碼塊僅包含一條語句,那么可以省略花括號。
- 如果代碼塊中的語句是單一的返回語句,那么
return
關(guān)鍵字也可以被省略,Lambda表達(dá)式會自動返回這條語句的結(jié)果。基于這些規(guī)則,選項A和D的Lambda表達(dá)式是正確的,它們遵循了正確的語法和結(jié)構(gòu),能夠編譯執(zhí)行。例如:
- 選項A:
dir.listFiles((File f) -> f.getName().endsWith(".Java"));
- 選項D:
dir.listFiles(f -> f.getName().endsWith(".Java"));
這兩個選項中,Lambda表達(dá)式接受一個
File
類型的參數(shù),并返回一個布爾值,表示文件名是否以".Java"結(jié)尾,這符合listFiles
方法需要的過濾器邏輯。
4.以下哪幾種方式可用來實現(xiàn)線程間通知和喚醒:( )
A.Object.wait/notify/notifyAll
B.ReentrantLock.wait/notify/notifyAll
C.Condition.await/signal/signalAll
D.Thread.wait/notify/notifyAll
正確答案:AC
wait()、notify()和notifyAll()方法的特性和使用場景
wait()
、notify()
和notifyAll()
是Java中用于線程間通信的內(nèi)置方法,它們定義在Object
類中,因此適用于所有Java對象。這些方法與同步機制緊密相關(guān),它們必須在同步塊或同步方法中被調(diào)用,以確保線程安全。
wait() 方法
wait()
方法允許一個線程放棄對象的鎖,并等待直到另一個線程通知該對象鎖已被釋放。- 當(dāng)一個線程調(diào)用對象的
wait()
方法時,它會立即釋放該對象的鎖,并進(jìn)入到該對象的等待集合(wait set)中。 - 調(diào)用
wait()
方法必須在同步控制塊或同步方法中進(jìn)行,以避免違反鎖的獨占性。
notify() 方法
notify()
方法用于喚醒在同一個對象的等待集合中等待的單個線程。- 調(diào)用
notify()
方法的線程必須持有該對象的鎖,但在調(diào)用后會立即釋放鎖,使得等待集合中的一個線程可以嘗試重新獲取鎖。 - 被喚醒的線程將繼續(xù)執(zhí)行,但它能否成功獲取鎖取決于鎖的可用性和其他線程的競爭。
notifyAll() 方法
notifyAll()
方法用于喚醒在同一個對象的等待集合中等待的所有線程。- 與
notify()
方法類似,調(diào)用notifyAll()
的線程必須持有該對象的鎖,并在調(diào)用后釋放鎖。 - 所有等待集合中的線程都會被喚醒,但它們?nèi)匀恍枰偁庢i以繼續(xù)執(zhí)行。
使用場景
wait()
、notify()
和notifyAll()
通常用于實現(xiàn)生產(chǎn)者-消費者問題、讀寫鎖、條件變量等多線程同步場景。- 這些方法可以幫助線程在某個條件尚未滿足時暫停執(zhí)行,并在條件滿足時恢復(fù)執(zhí)行,從而實現(xiàn)線程間的協(xié)作。
注意事項
- 在使用
wait()
、notify()
和notifyAll()
時,應(yīng)當(dāng)小心避免死鎖和競態(tài)條件。 - 通常建議在等待條件前使用循環(huán)檢查來確認(rèn)條件是否真的已經(jīng)滿足,以防止虛假喚醒(spurious wakeup)。
- 這些方法在多線程編程中是非常強大的工具,但也需要謹(jǐn)慎使用,以確保程序的正確性和性能。
3.以下代碼輸出的是:
public class SendValue{
public String str=“6”;
public static void main(String[] args) {
SendValue sv=new SendValue();
sv.change(sv.str);
System.out.println(sv.str);
}
public void change(String str) {
str=“10”;
}
}
A.6
B.10
C.都不對
D.16
正確答案:A
代碼中的change
方法接受一個String
類型的參數(shù)str
,并將其修改為"10"
。然而,這個方法內(nèi)部的str
變量是局部變量,它與類的成員變量str
是兩個不同的引用。因此,即使局部變量str
的值被修改,類的成員變量str
的值仍然保持不變,其值為"6"
。所以,當(dāng)打印出sv.str
的值時,輸出結(jié)果是6
。這說明Java中字符串是不可變的,修改字符串實質(zhì)上是創(chuàng)建了一個新的字符串對象,而不會改變原始字符串對象的值。因此,正確答案是A.6。