1上遥、單例 餓漢式 為啥是線程安全的?
說明:static 變量 singleTon 争涌,被所有對象共享粉楚,在內(nèi)存中只有一個副本,在類初次加載的時候才會初始化
問題:在沒有使用這個對象的情況下就加載到內(nèi)存是一種很大的浪費。
這里有一個很好能說明靜態(tài)修飾和非靜態(tài)修飾的說明:
非靜態(tài)方法調(diào)用靜態(tài)方法就沒問題模软,是因為靜態(tài)方法在類加載的時候就已經(jīng)初始化了伟骨;
靜態(tài)方法內(nèi)調(diào)用非靜態(tài)變量或者方法就報錯,是因為燃异,不確定非靜態(tài)的方法到底有沒有完成初始化
2携狭、懶漢式
說明:這種方法在調(diào)用Singleton.getInstance()時才會創(chuàng)建對象,起到了延遲加載的作用回俐。
問題:線程不安全逛腿,假如有兩個線程同時去訪問,那么會得到兩個不同的實例仅颇,避免了上面的提前創(chuàng)建好實例单默,造成的資源浪費
3、加鎖
說明:線程安全灵莲,但效率低下雕凹,鎖住了整個方法
4殴俱、減小鎖的粒度:
問題:假設(shè)2個線程可以同時進入到 if 語句中政冻,線程A實例化對象返回,線程B不用經(jīng)過判斷直接再次實例化對象线欲,并返回另一個對象明场,為了解決這個問題,引入了臭名昭著的 雙重鎖機制