ex1: public class Singleton { private static final Singleton singleton = null; private Singleton() { } public static Singleton getInstance() { if (singleton== null) { singleton= new Singleton(); } return singleton; } } 這個(gè)不多說了,肯定是錯(cuò)誤的,如果多個(gè)線程訪問的時(shí)候都死==null,那么接下來就是產(chǎn)生多個(gè)實(shí)例。不算單例模式。 ex2: public class Singleton { private static final Singleton singleton = null; private Singleton() { } public static Singleton getInstance() { if (singleton== null) { synchronized (Singleton.class) { singleton= new Singleton(); } } return singleton; } } 這個(gè)雖然加了同步鎖,但是如果多個(gè)線程同步訪問==null,那么還是會(huì)產(chǎn)生多個(gè)實(shí)例,只是產(chǎn)生實(shí)例的時(shí)候同步而已。 ex3: public class Singleton { private static final Singleton singleton = null; private Singleton() { } public static Singleton getInstance() { synchronized (Singleton.class) { if (singleton== null) { singleton= new Singleton(); } } return singleton; } } 這個(gè)就可以了,但是這個(gè)地方對于每個(gè)訪問的這個(gè)方法都是同步,而最需要的同步只是在new的地方,所以這樣做雖然保證了單例,但是效率有點(diǎn)低哦。 ex4: public class Singleton { private static final Singleton singleton = null; private Singleton() { } public static Singleton getInstance() { if (singleton== null) { synchronized (Singleton.class) { if (singleton== null) { singleton= new Singleton(); } } } return singleton; } } 這個(gè)不錯(cuò),保證了單例。這個(gè)叫做double-check 雙重檢查。 還有一個(gè)比較簡單的寫法。 ex5: public class Singleton { private static final Singleton singleton = new Singleton(); private Singleton() { } public static Singleton getInstance() { return singleton; } } 這樣也可以,具體2種差別就不多說了。下面這個(gè)看起來要簡單好多的哈
|