溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java日常練習題之排序與鎖的示例分析

發(fā)布時間:2021-08-23 10:08:46 來源:億速云 閱讀:136 作者:小新 欄目:開發(fā)技術

這篇文章主要介紹Java日常練習題之排序與鎖的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

    1、對于A、B兩種排隊方式,說法正確的是

    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。

    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是互斥鎖,而不是信號量。
    2、 題目問的是那種不是進程間通信的方式,A 鎖,用來保證在任一時刻,只能有一個線程訪問某個對象;B 管道,進程間可以通過管道進行通信;C “插座”,兩個程序中進程通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)的交換;D 消息隊列,也可以實現(xiàn)進程之間信息交互。

    3、設在內(nèi)存中有P1,P2,P3三道程序,并按照P1,P2,P3的優(yōu)先級次序運行,其中內(nèi)部計算和IO操作時間由下表給出(CPU計算和IO資源都只能同時由一個程序占用): P1:計算60ms—》IO 80ms—》計算20ms P2:計算120ms—》IO 40ms—》計算40ms P3:計算40ms—》IO 80ms—》計算40ms 并行完成三道程序比單道運行節(jié)省的時間是()

    正確答案:C

    A 80ms

    B 120ms

    C 160ms

    D 200ms

    題解:
    1、 題意,CPU操作和IO操作可以并行,所以節(jié)約的時間就是二者平行的時間。

    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、 假設有兩個線程,線程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ā)生了。

    5、一個容器類數(shù)據(jù)結構,讀寫平均,使用鎖機制保證線程安全。如果要綜合提高該數(shù)據(jù)結構的訪問性能,最好的辦法是______。

    正確答案:C

    A 只對寫操作加鎖,不對讀操作加鎖

    B 讀操作不加鎖,采用copyOnWrite的方式實現(xiàn)寫操作

    C 分區(qū)段加鎖

    D 無法做到

    題解:
    1、 臟數(shù)據(jù):從目標中取出的數(shù)據(jù)已經(jīng)過期、錯誤或者沒有意義,這種數(shù)據(jù)就叫做臟數(shù)據(jù)。 臟讀:讀取出來臟數(shù)據(jù)就叫臟讀。
    2、 讀寫平均??

    6、產(chǎn)生系統(tǒng)死鎖的原因是由于()

    正確答案: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)允許多個進程同時訪問的設備

    7、競選條件(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ù)未及時寫入內(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ù)都有可能。

    8、數(shù)據(jù)庫以及線程發(fā)生死鎖的必要條件是什么?

    正確答案: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)等待

    9、有兩個線程,最初 n=0,一個線程執(zhí)行 n++; n++; 另一個執(zhí)行 n+=2; 問,最后可能的 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 都可以

    10、無鎖化編程有哪些常見方法?

    正確答案: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è)資訊頻道!

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

    AI