Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(58)
承蒙各位厚愛,我們一起每天進(jìn)步一點(diǎn)點(diǎn)?。ㄊ髽?biāo)選中空白處查看答案)
1、對(duì)于A、B兩種排隊(duì)方式,說法正確的是
正確答案:C
A 方式A效率更高
B 方式B效率更高
C 當(dāng)排隊(duì)的任務(wù)中有長(zhǎng)耗時(shí)任務(wù)且比例較低時(shí),方式B更具優(yōu)勢(shì)
D 都不正確
題解:
2、 把第一種模型理解為單任務(wù)的。如果我們遇到了一個(gè)需要等待的IO操作,可能會(huì)讓此進(jìn)程阻塞,其他的進(jìn)程得不到執(zhí)行。如果其他進(jìn)程等待時(shí)間很長(zhǎng)的話,可能會(huì)導(dǎo)致其他進(jìn)程餓死。 把第二種模型理解為并發(fā)的。舉個(gè)例子,當(dāng)我們?cè)O(shè)計(jì)一款類似于wps這樣的文字處理軟件的時(shí)候,我們可以開一個(gè)線程來與用戶進(jìn)行交互,開第二個(gè)線程來對(duì)讀取進(jìn)內(nèi)存中的數(shù)據(jù)進(jìn)行計(jì)算,當(dāng)我們計(jì)算完了之后,可能需要把這些數(shù)據(jù)保存進(jìn)磁盤中,這時(shí)候,我們可以開第三個(gè)線程來負(fù)責(zé)把數(shù)據(jù)寫入磁盤中,我們知道,對(duì)于磁盤的讀寫操作是毫秒級(jí)別的(而對(duì)于內(nèi)存的讀寫是納秒級(jí)別的。不要覺得毫秒級(jí)別的時(shí)間很短,對(duì)于計(jì)算機(jī)來說已經(jīng)很長(zhǎng)了。對(duì)于大量數(shù)據(jù)排序都不一定需要毫秒),所以非常的慢,所以,如果我們把這個(gè)耗時(shí)比較長(zhǎng)的操作專門交給一個(gè)線程來處理的話,就可以充分利用CPU。
2、Inter-process communication (IPC) is the transfer of data among processes. Which of the following is NOT a typical programming technique for IPC?
正確答案:A
A mutex
B pipe
C socket
D message queue
題解:
1、 要注意區(qū)分,mutex是互斥鎖,而不是信號(hào)量。
2、 題目問的是那種不是進(jìn)程間通信的方式,A 鎖,用來保證在任一時(shí)刻,只能有一個(gè)線程訪問某個(gè)對(duì)象;B 管道,進(jìn)程間可以通過管道進(jìn)行通信;C “插座”,兩個(gè)程序中進(jìn)程通過一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換;D 消息隊(duì)列,也可以實(shí)現(xiàn)進(jìn)程之間信息交互。
3、設(shè)在內(nèi)存中有P1,P2,P3三道程序,并按照P1,P2,P3的優(yōu)先級(jí)次序運(yùn)行,其中內(nèi)部計(jì)算和IO操作時(shí)間由下表給出(CPU計(jì)算和IO資源都只能同時(shí)由一個(gè)程序占用): P1:計(jì)算60ms—》IO 80ms—》計(jì)算20ms P2:計(jì)算120ms—》IO 40ms—》計(jì)算40ms P3:計(jì)算40ms—》IO 80ms—》計(jì)算40ms 并行完成三道程序比單道運(yùn)行節(jié)省的時(shí)間是()
正確答案:C
A 80ms
B 120ms
C 160ms
D 200ms
題解:
1、 題意,CPU操作和IO操作可以并行,所以節(jié)約的時(shí)間就是二者平行的時(shí)間。
4、下列哪種操作可能帶來死鎖?
正確答案:C
A lock(m1) lock(m2) unlock(m1) unlock(m2)
B lock(m1) lock(m2) unlock(m2) lock(m2) unlock(m1) unlock(m2)
C lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1)
D lock(m1) lock(m2) unlock(m1) unlock(m2) lock(m1) unlock(m1)
題解:
1、 假設(shè)有兩個(gè)線程,線程1執(zhí)行到lock(m1)
2、lock(m2)
3、unlock(m1),此時(shí)線程1持有鎖m2
4、想要獲取鎖m1;線程2執(zhí)行到lock(m1)
5、此時(shí)線程2持有鎖m1
6、想要獲取鎖m2。兩個(gè)線程都拿著對(duì)方想要得到的鎖,造成死鎖。
7、 1 2 3 4 5 6 lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1) 對(duì)于C選項(xiàng):假設(shè)有A、B兩個(gè)線程并發(fā)執(zhí)行 當(dāng)A執(zhí)行完3,占有m2時(shí),申請(qǐng)m1. 當(dāng)B執(zhí)行完1,占有m1,申請(qǐng)m2時(shí) 這時(shí)死鎖就發(fā)生了。
5、一個(gè)容器類數(shù)據(jù)結(jié)構(gòu),讀寫平均,使用鎖機(jī)制保證線程安全。如果要綜合提高該數(shù)據(jù)結(jié)構(gòu)的訪問性能,最好的辦法是______。
正確答案:C
A 只對(duì)寫操作加鎖,不對(duì)讀操作加鎖
B 讀操作不加鎖,采用copyOnWrite的方式實(shí)現(xiàn)寫操作
C 分區(qū)段加鎖
D 無法做到
題解:
1、 臟數(shù)據(jù):從目標(biāo)中取出的數(shù)據(jù)已經(jīng)過期、錯(cuò)誤或者沒有意義,這種數(shù)據(jù)就叫做臟數(shù)據(jù)。 臟讀:讀取出來臟數(shù)據(jù)就叫臟讀。
2、 讀寫平均??
6、產(chǎn)生系統(tǒng)死鎖的原因是由于()
正確答案:C
A 進(jìn)程釋放資源
B 一個(gè)進(jìn)程進(jìn)入死循環(huán)
C 多個(gè)進(jìn)程競(jìng)爭(zhēng),資源出現(xiàn)循環(huán)等待
D 多個(gè)進(jìn)程競(jìng)爭(zhēng)共享型設(shè)備
題解:
1、 C 產(chǎn)生死鎖的原因主要是: (1) 因?yàn)橄到y(tǒng)資源不足。 (2) 進(jìn)程運(yùn)行推進(jìn)的順序不合適。 (3) 資源分配不當(dāng)?shù)取?如果系統(tǒng)資源充足,進(jìn)程的資源請(qǐng)求都能夠得到滿足,死鎖出現(xiàn)的可能性就很低,否則 就會(huì)因爭(zhēng)奪有限的資源而陷入死鎖。其次,進(jìn)程運(yùn)行推進(jìn)順序與速度不同,也可能產(chǎn)生死鎖。 產(chǎn)生死鎖的四個(gè)必要條件: (1) 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用。 (2) 請(qǐng)求與保持條件:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放。 (3) 不剝奪條件:進(jìn)程已獲得的資源,在末使用完之前,不能強(qiáng)行剝奪。 (4) 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。 這四個(gè)條件是死鎖的必要條件,只要系統(tǒng)發(fā)生死鎖,這些條件必然成立,而只要上述條件之 一不滿足,就不會(huì)發(fā)生死鎖。 D選項(xiàng):共享型設(shè)備是指在一段時(shí)間內(nèi)允許多個(gè)進(jìn)程同時(shí)訪問的設(shè)備
2、 D選項(xiàng):共享型設(shè)備是指在一段時(shí)間內(nèi)允許多個(gè)進(jìn)程同時(shí)訪問的設(shè)備
7、競(jìng)選條件(race condition)的情況下,兩線程執(zhí)行如下代碼段,其中count為共享變量,線程1執(zhí)行代碼段A,線程2指向代碼段B,那么變量count的值可能為 int count = 10; 代碼段A: Thread_1()
{
//do something
count++;
}
代碼段B: Thread_2()
{
//do something
count–;
}
正確答案:ABC
A 9
B 10
C 11
D 12
題解:
1、 ABC ++和–并非原子操作,存在被打斷的可能性。 A:線程1先執(zhí)行,++后數(shù)據(jù)未及時(shí)寫入內(nèi)存便被線程2打斷,執(zhí)行完線程2,數(shù)據(jù)已被更改,輸出9 B:順序正常執(zhí)行 C:線程2先執(zhí)行,–后數(shù)據(jù)未及時(shí)寫入內(nèi)存便被線程1打斷,執(zhí)行完線程1,數(shù)據(jù)已被更改,輸出11
2、 要么先執(zhí)行線程1,要么先執(zhí)行線程2,然后根據(jù)自增自減運(yùn)算符得出數(shù)來,除了12,其他數(shù)都有可能。
8、數(shù)據(jù)庫以及線程發(fā)生死鎖的必要條件是什么?
正確答案:ABCD
A 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用
B 請(qǐng)求與保持條件:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放。
C 不剝奪條件:進(jìn)程已獲得的資源,在末使用完之前,不能強(qiáng)行剝奪。
D 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。
題解:
1、 產(chǎn)生死鎖的原因主要是: (1) 因?yàn)橄到y(tǒng)資源不足。 (2) 進(jìn)程運(yùn)行推進(jìn)的順序不合適。 (3) 資源分配不當(dāng)?shù)取?產(chǎn)生死鎖的四個(gè)必要條件: (1) 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用。 (2) 請(qǐng)求與保持條件:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放。 (3) 不剝奪條件:進(jìn)程已獲得的資源,在末使用完之前,不能強(qiáng)行剝奪。 (4) 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。
2、 1.互斥 2.占有等待 3.非剝奪 4.循環(huán)等待
9、有兩個(gè)線程,最初 n=0,一個(gè)線程執(zhí)行 n++; n++; 另一個(gè)執(zhí)行 n+=2; 問,最后可能的 n 值?
正確答案:BCD
A 1
B 2
C 3
D 4
題解:
1、大家要知道 C語言中的 ++ 和 += 并不是原子操作,而是通過多條微程序組成的,因此 ++ 和 += 在執(zhí)行過程中可能被中斷的 第一種可能情況:現(xiàn)在假設(shè)兩個(gè)線程沒有并行順序執(zhí)行的那么結(jié)果顯然是 4。 第二種可能情況:再假設(shè)現(xiàn)在第一個(gè)n++ 已經(jīng)執(zhí)行完了 但是結(jié)果還沒有寫回內(nèi)存 這個(gè)時(shí)候 n+=2 已經(jīng)全部執(zhí)行完 2 寫進(jìn)了內(nèi)存 結(jié)束 然后回到n++的寫回操作 這個(gè)時(shí)候內(nèi)存就從2被改回1了,后面再來一次n++ 結(jié)果就為2。 第三種可能情況: 第n+=2 先讀取n的值到寄存器 即0入寄存器 這個(gè)時(shí)候被中斷 第一個(gè)n++開始執(zhí)行 并直到結(jié)束 內(nèi)存被改成了1 ,然后 n+=2 繼續(xù)執(zhí)行 結(jié)束后內(nèi)存變?yōu)? 第二個(gè)n++再執(zhí)行 結(jié)果就是3了
2、 如前面大佬@琥珀大川說的2-4 可能的原因,我嘗試說一下1 為啥不行 一進(jìn)程執(zhí)行兩次n++, 二進(jìn)程 n+=2; 無論如何,兩個(gè)進(jìn)程都會(huì)進(jìn)行一次讀取n的數(shù)值,和寫回操作。且兩個(gè)進(jìn)程都會(huì)要運(yùn)行完自己的程序塊。 二進(jìn)程每次都是+2,不會(huì)出現(xiàn)1 一進(jìn)程雖然兩次分開+1,但是只要運(yùn)行完進(jìn)程結(jié)果就是2,除非運(yùn)行完第一個(gè)n++寫回后,n的數(shù)值被改回0。顯然不會(huì)出現(xiàn)這種情況
3、 // ++ 和 += 都不是原子操作,所有都可能被中斷,結(jié)果就是 2 ~ 4 都可以
10、無鎖化編程有哪些常見方法?
正確答案:ABCD
A 針對(duì)計(jì)數(shù)器,可以使用原子加
B 只有一個(gè)生產(chǎn)者和一個(gè)消費(fèi)者,那么就可以做到免鎖訪問環(huán)形緩沖區(qū)(Ring Buffer)
C RCU(Read-Copy-Update),新舊副本切換機(jī)制,對(duì)于舊副本可以采用延遲釋放的做法
D CAS(Compare-and-Swap),如無鎖棧,無鎖隊(duì)列等待
題解:
1、這阿里的題目真不白給。。都不知道四個(gè)選項(xiàng)說的是啥
2、 A 原子操作是匯編級(jí)別支持的指令lock xadd,如c++中的interlockIncrement,java中有AutomicInteger都是對(duì)其的封裝。簡(jiǎn)單變量的線程同步用這種方式效率最高。 B 多個(gè)生產(chǎn)者和多個(gè)消費(fèi)者,一樣可以做到免鎖訪問,但要使用原子操作。這里的意思應(yīng)該是不用原子操作級(jí)別的免鎖,理由也很簡(jiǎn)單,生產(chǎn)者和消費(fèi)者需要修改的位置是分開的(生產(chǎn)者加在尾部,消費(fèi)者從頭部消費(fèi)),且只有一個(gè)讀一個(gè)寫,不會(huì)發(fā)生沖突。所以只有一點(diǎn)需要關(guān)注,就是尾部指針和頭部指針每次需要比較以避免生產(chǎn)溢出或者過度消費(fèi),而簡(jiǎn)單變量的讀操作都是原子的。 C 類似的一個(gè)概念叫CopyOnWrite,復(fù)制一份,修改完后,替換回去時(shí)只需替換一個(gè)指針或引用,鎖住的粒度非常小。但有可能還有線程持有的是舊的指針,因此舊的副本需要延遲釋放。 D 匯編級(jí)別支持的指令cmpxchg,鎖定內(nèi)存地址,比較地址中修改前的內(nèi)容是否與修改時(shí)的值一致,如果不一致就說明有其他線程改動(dòng),需要重新做。如,內(nèi)存地址0x123456中原來存放的是10101010,但CPU執(zhí)行到cmpxchg指令時(shí),發(fā)現(xiàn)內(nèi)存中變成了11111111,那么就認(rèn)為其他線程已經(jīng)修改了這個(gè)地址的值,需要重新讀取0x123456中的值11111111,再做一次cmpxchg,如果這次發(fā)現(xiàn)內(nèi)存中仍然是11111111,那么cmpxchg就會(huì)把新的值寫入到0x123456中去。這里面有個(gè)ABA問題,就是有線程改了2次從11111111 -> 10111111 -> 11111111,那么CAS操作是識(shí)別不了的,需要從業(yè)務(wù)層去避免,如果直接在0x123456再放一個(gè)地址值,而地址值如果不先釋放再重新申請(qǐng)內(nèi)存,就不會(huì)出現(xiàn)重復(fù)值。
3、 ABCD JAVA對(duì)應(yīng): A:AtomicInteger B:http://ifeve.com/the-disruptor-lock-free-publishing/ C:CopyOnWriteArrayList D:Unsafe
答案匯總:
1、正確答案:C
2、正確答案:A
3、正確答案:C
4、正確答案:C
5、正確答案:C
6、正確答案:C
7、正確答案:ABC
8、正確答案:ABCD
9、正確答案:BCD
10、正確答案:ABCD
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java8 Instant 時(shí)間戳實(shí)例講解
Instant類是Java8 中補(bǔ)充的一個(gè) 時(shí)間戳類,nstant 可以使用靜態(tài)方法 now()或者of()方法來創(chuàng)建一個(gè)實(shí)例對(duì)象,本文通過實(shí)例代碼講解Java8 Instant 時(shí)間戳,感興趣的朋友跟隨小編一起看看吧2022-11-11關(guān)于pom.xml中maven無法下載springcloud包問題
小編遇到這樣一個(gè)問題spring-cloud-starter-feign,spring-cloud-starter-eureka 一直無法下載,maven倉庫中包路徑顯示為unknown,怎么解決呢?下面小編給大家?guī)砹藀om.xml中maven無法下載springcloud包問題,需要的朋友可以參考下2022-08-08使用Spring @DependsOn控制bean加載順序的實(shí)例
這篇文章主要介紹了使用Spring @DependsOn控制bean加載順序的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07IntelliJ?IDEA2022中的Java文檔注釋設(shè)置、操作方法
這篇文章主要介紹了IntelliJ?IDEA2022中的Java文檔注釋設(shè)置、操作詳述,本文通過圖文并茂的方式給大家介紹IDEA2022?文檔注釋設(shè)置方法,需要的朋友可以參考下2022-08-08Java二分法查找_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java二分法查找的相關(guān)資料,需要的朋友可以參考下2017-04-04基于mybatis-plus timestamp返回為null問題的排除
這篇文章主要介紹了mybatis-plus timestamp返回為null問題的排除,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java Socket編程實(shí)現(xiàn)簡(jiǎn)單的問候服務(wù)
這篇文章主要為大家介紹了Java Socket編程實(shí)現(xiàn)簡(jiǎn)單的問候服務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01Java編程實(shí)現(xiàn)深度優(yōu)先遍歷與連通分量代碼示例
這篇文章主要介紹了Java編程實(shí)現(xiàn)深度優(yōu)先遍歷與連通分量代碼示例,2017-11-11