您好,登錄后才能下訂單哦!
這篇文章主要介紹Java日常練習題之排序與鎖的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
正確答案:C
A 方式A效率更高
B 方式B效率更高
C 當排隊的任務中有長耗時任務且比例較低時,方式B更具優(yōu)勢
D 都不正確
題解:
2、 把第一種模型理解為單任務的。如果我們遇到了一個需要等待的IO操作,可能會讓此進程阻塞,其他的進程得不到執(zhí)行。如果其他進程等待時間很長的話,可能會導致其他進程餓死。 把第二種模型理解為并發(fā)的。舉個例子,當我們設計一款類似于wps這樣的文字處理軟件的時候,我們可以開一個線程來與用戶進行交互,開第二個線程來對讀取進內(nèi)存中的數(shù)據(jù)進行計算,當我們計算完了之后,可能需要把這些數(shù)據(jù)保存進磁盤中,這時候,我們可以開第三個線程來負責把數(shù)據(jù)寫入磁盤中,我們知道,對于磁盤的讀寫操作是毫秒級別的(而對于內(nèi)存的讀寫是納秒級別的。不要覺得毫秒級別的時間很短,對于計算機來說已經(jīng)很長了。對于大量數(shù)據(jù)排序都不一定需要毫秒),所以非常的慢,所以,如果我們把這個耗時比較長的操作專門交給一個線程來處理的話,就可以充分利用CPU。
正確答案:A
A mutex
B pipe
C socket
D message queue
題解:
1、 要注意區(qū)分,mutex是互斥鎖,而不是信號量。
2、 題目問的是那種不是進程間通信的方式,A 鎖,用來保證在任一時刻,只能有一個線程訪問某個對象;B 管道,進程間可以通過管道進行通信;C “插座”,兩個程序中進程通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)的交換;D 消息隊列,也可以實現(xiàn)進程之間信息交互。
正確答案:C
A 80ms
B 120ms
C 160ms
D 200ms
題解:
1、 題意,CPU操作和IO操作可以并行,所以節(jié)約的時間就是二者平行的時間。
正確答案: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、 假設有兩個線程,線程1執(zhí)行到lock(m1)
2、lock(m2)
3、unlock(m1),此時線程1持有鎖m2
4、想要獲取鎖m1;線程2執(zhí)行到lock(m1)
5、此時線程2持有鎖m1
6、想要獲取鎖m2。兩個線程都拿著對方想要得到的鎖,造成死鎖。
7、 1 2 3 4 5 6 lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1) 對于C選項:假設有A、B兩個線程并發(fā)執(zhí)行 當A執(zhí)行完3,占有m2時,申請m1. 當B執(zhí)行完1,占有m1,申請m2時 這時死鎖就發(fā)生了。
正確答案:C
A 只對寫操作加鎖,不對讀操作加鎖
B 讀操作不加鎖,采用copyOnWrite的方式實現(xiàn)寫操作
C 分區(qū)段加鎖
D 無法做到
題解:
1、 臟數(shù)據(jù):從目標中取出的數(shù)據(jù)已經(jīng)過期、錯誤或者沒有意義,這種數(shù)據(jù)就叫做臟數(shù)據(jù)。 臟讀:讀取出來臟數(shù)據(jù)就叫臟讀。
2、 讀寫平均??
正確答案:C
A 進程釋放資源
B 一個進程進入死循環(huán)
C 多個進程競爭,資源出現(xiàn)循環(huán)等待
D 多個進程競爭共享型設備
題解:
1、 C 產(chǎn)生死鎖的原因主要是: (1) 因為系統(tǒng)資源不足。 (2) 進程運行推進的順序不合適。 (3) 資源分配不當?shù)取?如果系統(tǒng)資源充足,進程的資源請求都能夠得到滿足,死鎖出現(xiàn)的可能性就很低,否則 就會因爭奪有限的資源而陷入死鎖。其次,進程運行推進順序與速度不同,也可能產(chǎn)生死鎖。 產(chǎn)生死鎖的四個必要條件: (1) 互斥條件:一個資源每次只能被一個進程使用。 (2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。 (3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。 (4) 循環(huán)等待條件:若干進程之間形成一種頭尾相接的循環(huán)等待資源關系。 這四個條件是死鎖的必要條件,只要系統(tǒng)發(fā)生死鎖,這些條件必然成立,而只要上述條件之 一不滿足,就不會發(fā)生死鎖。 D選項:共享型設備是指在一段時間內(nèi)允許多個進程同時訪問的設備
2、 D選項:共享型設備是指在一段時間內(nèi)允許多個進程同時訪問的設備
{
//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ù)未及時寫入內(nèi)存便被線程2打斷,執(zhí)行完線程2,數(shù)據(jù)已被更改,輸出9 B:順序正常執(zhí)行 C:線程2先執(zhí)行,–后數(shù)據(jù)未及時寫入內(nèi)存便被線程1打斷,執(zhí)行完線程1,數(shù)據(jù)已被更改,輸出11
2、 要么先執(zhí)行線程1,要么先執(zhí)行線程2,然后根據(jù)自增自減運算符得出數(shù)來,除了12,其他數(shù)都有可能。
正確答案:ABCD
A 互斥條件:一個資源每次只能被一個進程使用
B 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
C 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
D 循環(huán)等待條件:若干進程之間形成一種頭尾相接的循環(huán)等待資源關系。
題解:
1、 產(chǎn)生死鎖的原因主要是: (1) 因為系統(tǒng)資源不足。 (2) 進程運行推進的順序不合適。 (3) 資源分配不當?shù)取?產(chǎn)生死鎖的四個必要條件: (1) 互斥條件:一個資源每次只能被一個進程使用。 (2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。 (3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。 (4) 循環(huán)等待條件:若干進程之間形成一種頭尾相接的循環(huán)等待資源關系。
2、 1.互斥 2.占有等待 3.非剝奪 4.循環(huán)等待
正確答案:BCD
A 1
B 2
C 3
D 4
題解:
1、大家要知道 C語言中的 ++ 和 += 并不是原子操作,而是通過多條微程序組成的,因此 ++ 和 += 在執(zhí)行過程中可能被中斷的 第一種可能情況:現(xiàn)在假設兩個線程沒有并行順序執(zhí)行的那么結果顯然是 4。 第二種可能情況:再假設現(xiàn)在第一個n++ 已經(jīng)執(zhí)行完了 但是結果還沒有寫回內(nèi)存 這個時候 n+=2 已經(jīng)全部執(zhí)行完 2 寫進了內(nèi)存 結束 然后回到n++的寫回操作 這個時候內(nèi)存就從2被改回1了,后面再來一次n++ 結果就為2。 第三種可能情況: 第n+=2 先讀取n的值到寄存器 即0入寄存器 這個時候被中斷 第一個n++開始執(zhí)行 并直到結束 內(nèi)存被改成了1 ,然后 n+=2 繼續(xù)執(zhí)行 結束后內(nèi)存變?yōu)? 第二個n++再執(zhí)行 結果就是3了
2、 如前面大佬@琥珀大川說的2-4 可能的原因,我嘗試說一下1 為啥不行 一進程執(zhí)行兩次n++, 二進程 n+=2; 無論如何,兩個進程都會進行一次讀取n的數(shù)值,和寫回操作。且兩個進程都會要運行完自己的程序塊。 二進程每次都是+2,不會出現(xiàn)1 一進程雖然兩次分開+1,但是只要運行完進程結果就是2,除非運行完第一個n++寫回后,n的數(shù)值被改回0。顯然不會出現(xiàn)這種情況
3、 // ++ 和 += 都不是原子操作,所有都可能被中斷,結果就是 2 ~ 4 都可以
正確答案:ABCD
A 針對計數(shù)器,可以使用原子加
B 只有一個生產(chǎn)者和一個消費者,那么就可以做到免鎖訪問環(huán)形緩沖區(qū)(Ring Buffer)
C RCU(Read-Copy-Update),新舊副本切換機制,對于舊副本可以采用延遲釋放的做法
D CAS(Compare-and-Swap),如無鎖棧,無鎖隊列等待
題解:
1、這阿里的題目真不白給。。都不知道四個選項說的是啥
2、 A 原子操作是匯編級別支持的指令lock xadd,如c++中的interlockIncrement,java中有AutomicInteger都是對其的封裝。簡單變量的線程同步用這種方式效率最高。 B 多個生產(chǎn)者和多個消費者,一樣可以做到免鎖訪問,但要使用原子操作。這里的意思應該是不用原子操作級別的免鎖,理由也很簡單,生產(chǎn)者和消費者需要修改的位置是分開的(生產(chǎn)者加在尾部,消費者從頭部消費),且只有一個讀一個寫,不會發(fā)生沖突。所以只有一點需要關注,就是尾部指針和頭部指針每次需要比較以避免生產(chǎn)溢出或者過度消費,而簡單變量的讀操作都是原子的。 C 類似的一個概念叫CopyOnWrite,復制一份,修改完后,替換回去時只需替換一個指針或引用,鎖住的粒度非常小。但有可能還有線程持有的是舊的指針,因此舊的副本需要延遲釋放。 D 匯編級別支持的指令cmpxchg,鎖定內(nèi)存地址,比較地址中修改前的內(nèi)容是否與修改時的值一致,如果不一致就說明有其他線程改動,需要重新做。如,內(nèi)存地址0x123456中原來存放的是10101010,但CPU執(zhí)行到cmpxchg指令時,發(fā)現(xiàn)內(nèi)存中變成了11111111,那么就認為其他線程已經(jīng)修改了這個地址的值,需要重新讀取0x123456中的值11111111,再做一次cmpxchg,如果這次發(fā)現(xiàn)內(nèi)存中仍然是11111111,那么cmpxchg就會把新的值寫入到0x123456中去。這里面有個ABA問題,就是有線程改了2次從11111111 -> 10111111 -> 11111111,那么CAS操作是識別不了的,需要從業(yè)務層去避免,如果直接在0x123456再放一個地址值,而地址值如果不先釋放再重新申請內(nèi)存,就不會出現(xiàn)重復值。
3、 ABCD JAVA對應: 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
以上是“Java日常練習題之排序與鎖的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關知識,歡迎關注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。