說到單例設計模式,Java中常用
java的單例模式一般分兩種,懶漢模式和餓漢模式java
class singleDemo { private static demoTarget; privete singleDemo () {}; public static singleDemo getInstance (data) { if (demoTarget === null) { demoTarget = new singleDemo() } return demoTarget } }
OK,簡單寫了下
1.私有化構造函數
2.在public獲取實例的方法中返回實例化對象設計模式
(雖然不少大佬都寫過啦,可是小生爲了加深記憶便再寫一遍)
雖然實現了單例模式,可是未考慮到線程安全,多個線程訪問能可能建立多個實例,也就是高併發時候單例模式會建立多個實例,那要如何解決此類問題呢?
這時候有兩種,一種是原來的懶漢模式藉助synchronized變身成爲線程安全的懶漢模式,另外一種則是餓漢模式安全
class singleDemo { private static demoTarget; privete singleDemo () {}; public static synchronized singleDemo getInstance (data) { if (demoTarget === null) { demoTarget= new singleDemo() } return demoTarget } }
什麼是餓漢模式呢?就是在懶漢模式的基礎加一層鎖,能保證單例多線程
class singleDemo { private static demoTarget = new singleDemo(); private singleDemo () {}; public static singleDemo getInstance (data) { return demoTarget } }
好啦,簡單的把java經常使用的兩種單例模式給寫了下,???標題不是js的單例模式嘛?標題寫錯了?沒寫錯,小生只是回憶一下java的知識,望各位大佬見諒
在js中如何實現單例呢?併發
因爲js都是單線程的,因此並不像java那樣麻煩,並不須要考慮多線程狀況,沒錯,只要能獲取單例就行,廢話不說,代碼先上函數
let Single = (function () { function constructor () {} var instance; function getInstance(){ if (!instance) { instance = new constructor() } return instance } return { getInstance: getInstance } })() const demo1 = Single.getInstance() const demo2 = Single.getInstance() console.log(demo1 === demo2) // true