1. 程式人生 > >java的static關鍵字理解,以及靜態非靜態鎖的區別

java的static關鍵字理解,以及靜態非靜態鎖的區別

覺得說的囉嗦的,可以直接看“三、結論”那段

一、static關鍵字的理解

         被static修飾的變數或者方法,可以被當前工程的任意類在任意地方使用。

         這是因為,它們被放入到了JVM堆中的永久代裡面

         因此,帶static關鍵字的內容不會被回收,不會被重複分配記憶體,直至服務下次被重啟。。。

二、靜態與非靜態鎖的區別

         這裡說的鎖,只是狹隘的指代“synchronized”關鍵字。

         眾所周知的是,被這個關鍵字修飾的非靜態方法,我稱其為方法鎖;加在方法內某段程式碼中的,我稱其為區域性鎖。

         區域性鎖與方發鎖的區別,就是鎖的粒度的大小。粒度越小,影響範圍越小,對業務整體的干擾也就越小。

         如果我們只對某個類的一個方法加鎖,那麼這個類中的其他方法是不受到鎖的制約的

         這個類的其他方法仍然保證了併發效能

         synchronized加鎖的核心,是對某個類的當前例項進行加鎖,防止其他執行緒對同一例項的當前方法的訪問。

         但是,如果是其他執行緒對這個類的不同例項的訪問,就不受鎖的限制和影響了。

         但是,當我們在方法上引入了static這個傢伙的時候,一切就變得不同了。

         因為上面我們說過了,被static修飾的物件,其實是生存於永久代中,那麼,當我們對這種方法加鎖的時候

         就相當於鎖住了類本身。因此對於這個被synchronized修飾的方法也就沒有所謂的不同例項的概念了,

         它是獨一份的,所以無論從哪個入口過來的對這個方法的訪問一定受到鎖的限制

三、結論

         3.1:synchronized出現的位置不同,鎖住的粒度大小也就不同

         3.2:沒有static的時候,被synchronized修飾的方法,鎖僅對類的當前例項生效;

                 反之,相當於是對整個類加鎖,任何例項都會受到鎖的制約

         3.3:區域性鎖對整體影響最小