经常遇到单例模式的题目,能死记硬背下来,却一直不明白其原因。最近好好接触了下,说说自己的理解。
单例模式主要私有化其构造方法,这样每当我们要实例化一个类的时候,我们就不能通过new的方式来实例化这个类。而这个时候,我们就可以通过调用类中我们自己写的一个实例化类来调用其方法。可是为什么要这么做呢?因为每当我们实例化一个类的时候,堆内存会为其分配一个空间,如果其引用已知存在的话,那么这个为其分配的空间会已知存在。而我们不断得调用一个类的同时,通过new方法会无数次得让同一个类重复需要内存对其分配空间,这样导致的结果是浪费了大量内存。所以我们可以做的是通过调用类中的实例化方法,只在第一次的时候实例化一次,以后每次要用的时候都只是用第一次实例化的那个类。
首先上一段最基础的单例模式的代码
<pre name="code" class="html">
<pre name="code" class="html">public class Singleton {
private static Singleton singleton = null;
private Singleton(){
}
public static Singleton getSingleton(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
这是第一种,自认为效率最低而且不能再多线程中同步的单例模式。
<pre name="code" class="html">public class Singleton {
private static Singleton singleton = null;
private Singleton(){
}
public synchornized static Singleton getSingleton(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
第二种,加上了syn同步代码块,但是效率还是很低
- public class Singleton {
- private static Singleton instance = new Singleton();
- private Singleton (){}
- public static Singleton getInstance() {
- return instance;
- }
- }