雙重檢驗鎖:設計模式中的單例模式,細分為單例模式中的懶加載模式。
單例模式
單例模式:指的是一個類只有一個對象。最簡單的實現方式是設一個枚舉類,只有一個對象。缺點是當對象還沒有被使用時,對象就已經創建存在了,對內存的消耗大。
懶漢式和餓漢式
懶漢式:是指使用時才產生對象。
餓漢式:不管用沒用到,一開始就創建好對象。
雙重檢驗鎖的代碼實現(來自菜鳥教程)
**代碼解析**
1.構造方法設為private(私有的)目的是防止外部new對象。因為單例模式只能有一個對象。否則就不是單例模式了。
2.在類里創建一個private的對象,防止外部直接訪問對象。
3.每個線程都是通過getSingleton()方法來獲取對象,相當于一個訪問器。它是靜態的,因為非靜態方法要通過對象來調用,而我們不允許外部創建對象。又因為這個方法是static的,所以上面創建的對象也要static的,因為靜態的方法只能訪問類里靜態的對象。
4.兩個if(singleton==null)的作用)假設有x個線程同時訪問getSingleton()方法想要獲取對象,其中有5個執行到了第一個if(singleton ==null){},開始競爭鎖,第一個競爭成功的向下執行最后得到對象,第二個if(singleton ==null){}是攔截第一個線程外的其他4個線程,(因為第一個線程競爭成功后,singleton就不為null了,第一個if就穿透了,需要后面的第二個if來攔截)這四個線程進入阻塞隊列。如果后面又來了幾個線程訪問getSingleton()方法,會直接被第一個if(singleton ==null){}攔截。
5.volatile的作用是在new完Sigleton()對象后,立即告訴其他線程singleton不為null了。防止已經通過第一個if判斷的線程繼續去競爭鎖。
6.鎖不能加在getSingleton()方法上,而是加在代碼塊上,因為會影響效率,很多線程想要調用該方法,讓其在判斷完if(singleton==null)后再加鎖效率浪費的時間更少。