前面我們說到了,線程既然存在鎖的競爭,那麼是否存在鎖不釋放的問題(即持有鎖的某一線程一直佔有鎖,不釋放(或者它在等待其他線程釋放鎖)),答案是肯定的。那麼我們如果解決這個問題呢??
在瞭解這個問題之前,我們需要明白什麼是死鎖,什麼情況下會問導致死鎖?
死鎖:處於相互競爭同一資源的線程之間的相互等待,都在等待其他釋放,即導致永久阻塞的現象。
活鎖:顯而易見,就是相互競爭資源的線程,沒有阻塞,正常按照一定的順序執行中。
導致死鎖的條件
1、循環等待, 即:線程A 等待線程B佔有資源釋放,而線程B又在等待線程A佔有資源釋放,這樣就出現了循環等待,都在等待對方釋放資源。
2、佔有且等待,即:線程A 已經佔有X資源,而且這個時候又等待Y資源,這個時候線程A並不釋放X資源
3、不允許搶佔 ,即:線程A 佔有了公共資源X,在線程A沒有釋放的時候,是不允許其他線程來搶佔的
那麼我們如何來解決這個死鎖的問題呢?(思路:顯壞這幾個產生死鎖的條件)
1、循環等待 --> 可以定義一個執行順序,根據這個順序執行來獲取指定的資源,這樣就可以避免彼此之間都沒釋放導致循環
2、佔有且等待 --> 可以根據所需要申請對應的資源,不需要再等到執行時再去獲取對應其他的資源。
3、不允許搶佔 --> 主動釋放佔有的資源,在其去申請其他資源是,申請不到,那麼主動釋放目前佔有的資源
Java內存模型是什麼? JMM
JMM是一個抽象的內存模型。
它定義了共享內存中多線程程序讀寫操作的行爲規範:在虛擬機中把共享變量存儲到內存以及從內
存中取出共享變量的底層實現細節。通過這些規則來規範對內存的讀寫操作從而保證指令的正確
性,它解決了CPU多級緩存、處理器優化、指令重排序導致的內存訪問問題,保證了併發場景下的
可見性。
什麼是線程安全??
原子性、有序性、可見性(硬件層面(CPU高速緩存、指令重排序、JMM))