Java多線程(併發)淺談(三)

     前面我們說到了,線程既然存在鎖的競爭,那麼是否存在鎖不釋放的問題(即持有鎖的某一線程一直佔有鎖,不釋放(或者它在等待其他線程釋放鎖)),答案是肯定的。那麼我們如果解決這個問題呢??

      在瞭解這個問題之前,我們需要明白什麼是死鎖,什麼情況下會問導致死鎖?

  死鎖:處於相互競爭同一資源的線程之間的相互等待,都在等待其他釋放,即導致永久阻塞的現象。

  活鎖:顯而易見,就是相互競爭資源的線程,沒有阻塞,正常按照一定的順序執行中。

  導致死鎖的條件

1、循環等待 即:線程A 等待線程B佔有資源釋放,而線程B又在等待線程A佔有資源釋放,這樣就出現了循環等待,都在等待對方釋放資源。

2、佔有且等待,即:線程A 已經佔有X資源,而且這個時候又等待Y資源,這個時候線程A並不釋放X資源

3、不允許搶佔 ,即:線程A 佔有了公共資源X,在線程A沒有釋放的時候,是不允許其他線程來搶佔的

那麼我們如何來解決這個死鎖的問題呢?(思路:顯壞這幾個產生死鎖的條件)

1、循環等待 --> 可以定義一個執行順序,根據這個順序執行來獲取指定的資源,這樣就可以避免彼此之間都沒釋放導致循環

2、佔有且等待 --> 可以根據所需要申請對應的資源,不需要再等到執行時再去獲取對應其他的資源。

3、不允許搶佔 --> 主動釋放佔有的資源,在其去申請其他資源是,申請不到,那麼主動釋放目前佔有的資源

 Java內存模型是什麼? JMM 
     JMM是一個抽象的內存模型。
    它定義了共享內存中多線程程序讀寫操作的行爲規範:在虛擬機中把共享變量存儲到內存以及從內
存中取出共享變量的底層實現細節。通過這些規則來規範對內存的讀寫操作從而保證指令的正確
性,它解決了CPU多級緩存、處理器優化、指令重排序導致的內存訪問問題,保證了併發場景下的
可見性。

什麼是線程安全??
原子性、有序性、可見性(硬件層面(CPU高速緩存、指令重排序、JMM))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章