摘要:很吧判斷是否有前驅線程等待獲取鎖公平所和非公平鎖的各自優勢是什么那公平鎖很好理解,可以防止出現線程饑餓現象,每一個線程都有機會獲取到鎖。非公平鎖可能會導致線程饑餓,但是我們一般使用非公平鎖,因為非公平鎖可以減少上下文的切換,提高效率。
鎖的重入是指同一個線程可以多次獲取同一個鎖,synchronize是隱式的可重入鎖,ReentrantLock通過代碼實現了鎖的重入:
final boolean nofairTryAcquire(int acquires){ final Thread current=Thread.currentThread(); int c=getState(); if(c==0){ if(compareAndSetState(0,acquires)){ setExclusiveOwnerThread(current); return true; } }else if(current==getExclusiveOwnerThread()){ int nextc=c+acquires; if(nextc<0) throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; }
從上面的代碼中,可以一目了然的發現,當獲取鎖的線程與擁有鎖的線程是同一個線程時,僅會對狀態進行累加。so easy ,并沒有什么難度。那接下來我們想一下,如何實現公平所和非公平鎖,上面的代碼是非公平鎖的實現方式。那如何實現公平鎖那?所謂的公平鎖就是所有獲取鎖的線程都要按照“先來后到”的順序獲取鎖。假設線程B在阻塞隊列中,等待獲取鎖,如果還有一個線程A在B的前面,那么B就要讓A先獲取鎖。因此在B嘗試獲取鎖之前,只要判斷一下它是否還有前驅的隊列即可。很easy吧:
final boolean fairTryAcquire(int acquires){ final Thread current=Thread.currentThread(); int c=getState(); if(c==0){ if(!hasQueuedPredecessors()&&compareAndSetState(0,acquires)){//判斷是否有前驅線程等待獲取鎖 setExclusiveOwnerThread(current); return true; } }else if(current==getExclusiveOwnerThread()){ int nextc=c+acquires; if(nextc<0) throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; }
公平所和非公平鎖的各自優勢是什么那?公平鎖很好理解,可以防止出現線程饑餓現象,每一個線程都有機會獲取到鎖。非公平鎖可能會導致線程饑餓,但是我們一般使用非公平鎖,因為非公平鎖可以減少上下文的切換,提高效率。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72822.html
摘要:的主要功能和關鍵字一致,均是用于多線程的同步。而僅支持通過查詢當前線程是否持有鎖。由于和使用的是同一把可重入鎖,所以線程可以進入方法,并再次獲得鎖,而不會被阻塞住。公平與非公平公平與非公平指的是線程獲取鎖的方式。 1.簡介 可重入鎖ReentrantLock自 JDK 1.5 被引入,功能上與synchronized關鍵字類似。所謂的可重入是指,線程可對同一把鎖進行重復加鎖,而不會被阻...
摘要:二什么是重入鎖可重入鎖,顧名思義,支持重新進入的鎖,其表示該鎖能支持一個線程對資源的重復加鎖。將由最近成功獲得鎖,并且還沒有釋放該鎖的線程所擁有。可以使用和方法來檢查此情況是否發生。 一、寫在前面 前幾篇我們具體的聊了AQS原理以及底層源碼的實現,具體參見 《J.U.C|一文搞懂AQS》《J.U.C|同步隊列(CLH)》《J.U.C|AQS獨占式源碼分析》《J.U.C|AQS共享式源...
摘要:本文旨在對鎖相關源碼本文中的源碼來自使用場景進行舉例,為讀者介紹主流鎖的知識點,以及不同的鎖的適用場景。中,關鍵字和的實現類都是悲觀鎖。自適應意味著自旋的時間次數不再固定,而是由前一次在同一個鎖上的自旋時間及鎖的擁有者的狀態來決定。 前言 Java提供了種類豐富的鎖,每種鎖因其特性的不同,在適當的場景下能夠展現出非常高的效率。本文旨在對鎖相關源碼(本文中的源碼來自JDK 8)、使用場景...
摘要:公平鎖為了保證時間上的絕對順序,需要頻繁的上下文切換,而非公平鎖會降低一定的上下文切換,降低性能開銷。因此,默認選擇的是非公平鎖,則是為了減少一部分上下文切換,保證了系統更大的吞吐量。ReentrantLock簡介ReentrantLock重入鎖,是實現Lock接口的一個類,也是在實際編程中使用頻率很高的一個鎖, 支持重入性,表示能夠對共享資源能夠重復加鎖,即當前線程獲取該鎖再次獲取不會被阻...
摘要:公平鎖為了保證時間上的絕對順序,需要頻繁的上下文切換,而非公平鎖會降低一定的上下文切換,降低性能開銷。因此,默認選擇的是非公平鎖,則是為了減少一部分上下文切換,保證了系統更大的吞吐量。ReentrantLock簡介ReentrantLock重入鎖,是實現Lock接口的一個類,也是在實際編程中使用頻率很高的一個鎖, 支持重入性,表示能夠對共享資源能夠重復加鎖,即當前線程獲取該鎖再次獲取不會被阻...
閱讀 1778·2023-04-25 14:33
閱讀 3378·2021-11-22 15:22
閱讀 2177·2021-09-30 09:48
閱讀 2684·2021-09-14 18:01
閱讀 1740·2019-08-30 15:55
閱讀 3006·2019-08-30 15:53
閱讀 2139·2019-08-30 15:44
閱讀 648·2019-08-30 10:58